【问题标题】:How to populate data to a Json Template如何将数据填充到 Json 模板
【发布时间】:2016-08-25 11:58:48
【问题描述】:

我有一个 Json 格式作为模板 (Temp.json)。以下是我的模板格式

{
  "products":[
    {
      "ProductTitleName": "",
      "ImageUrl":""
    }
  ]
}

现在我必须将数据填充为这种格式,基本上 products 数组将有很多对象节点。我使用 JsonPath 表达式从 Raw Json 中提取相关属性值。我的问题是如何使用此模板并将数据填充到此结构中。

Reason to use Template Json -

  1. 我使用了一个模板 json 来避免 pojo 类
  2. 虽然 JsonPath 表达式有助于提取必要的属性并将它们设置为目标属性,但我之前构建的最终 Json 输出结果是即时(运行时)。
  3. 如果假设我稍后要在这些属性中添加另一个属性,这会更容易并且可以避免代码更改。

所以为了避免那些提到的原因,我计划有一个模板 json 并遵守该结构,这是一个好方法吗,如果是这样,请帮助我将数据填充到模板中,如果不能帮助我更好的方法.

【问题讨论】:

  • 如果您不知道它需要多长时间,模板将如何帮助您填充产品数组?此外,构建 JSON 不仅仅是连接文本:还有您需要考虑的转义规则等。如果您真的不想为此使用 pojos(为什么会这样),我建议您使用流式处理方法(例如 Jackson 流媒体 API)
  • @marthursson 我正在尝试定义一个模板,因为我的要求稍后可能会发生变化(即我可能需要产品对象的另一个属性,所以在这种情况下我必须来编辑我的 pojo 类权利) 就像再次编辑我的代码一样,根据 SOLID 原则这是不好的,所以我想有一个模板,我可以轻松地添加该属性,我不必更改代码。
  • @marthursson 就我的产品数组有多长而言,无论如何通过我的模板我定义了一个通用项目对象的属性,并且产品数组中的每个项目对象都将具有理想的相同属性,只是值是会改变

标签: java json templates jsonpath


【解决方案1】:

如果您只需要避免使用 pojo 类,您可以使用通用的Map 来做同样的事情。在这种情况下,您不需要解析基本模板。

Map<String, Object> products = new HashMap<>();
List<Map<String, Object>> listProducts = new ArrayList<>();

for () { // Loop over products
    Map<String, Object> product = new HashMap<>();
    product.put("ProductTitleName", "YourTitle");
    product.put("ImageUrl", "YourImageUrl");
    listProducts.add(product);
}

products.put("products", listProducts);
// Now you can use products Map instead of an equivalent pojo class

如果您需要使用模板,请尝试使用Velocity。它是一个模板引擎,可以很好地构建文本文件(在本例中为 json 文件),但来自模板。它不仅限于文件,如有必要,它也适用于字符串或流。

【讨论】:

  • 感谢您的快速响应,但想象一下,如果我稍后要添加更多属性,到那时我必须来编辑这段代码,我需要另一个 put 语句,这是一件坏事根据SOLIDS原则做正确,如果我有一个模板,我可以简单地添加另一个属性而不更改代码,希望我对你有意义
  • 如果您不知道新属性的存在以及如何从另一个 java 对象中提取它们,您认为如何添加新属性?
  • 这里的 template.json 有助于给出每个产品对象的结构,我定义了规则(JsonPath 表达式 - 将其提取并映射到模板 json 属性中的确切属性),如下所示“规则” : [ { "source": "$.payload.recommendations[*].products[*].productTitle", "target": "$.products[].productTitle" }, { "source": "$ .payload.recommendations[*].products[*].image.url", "target": "$.products[].imageUrl" } ]`
  • @kesh 阅读了更新的答案。基本上,使用 Velocity 而不是使用 JsonPath,它是一个更好的产品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2016-08-11
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多