简体   繁体   English

使用 JsonGenerator 将字符串映射到 JSON

[英]Map a String into JSON using JsonGenerator

Given is a JSON array给定的是一个 JSON 数组

[
    {
        "ref": "idValue",
        "data": {
            "filter": [
                {
                    "property": "number"
                }
            ],
            "stateId": "contacts"
        }
    }
]

I store this array as String in a database.我将此数组作为字符串存储在数据库中。

Now I want to embed the given String into a new JSON object, generated dynamically by javax.json.stream.JsonGenerator .现在我想将给定的 String 嵌入到一个新的 JSON 对象中,该对象由javax.json.stream.JsonGenerator动态生成。

A possible result should look like this:可能的结果应如下所示:

{
    "newValue": "someValue",
    "storedFilters": [
        {
            "ref": "idValue",
            "data": {
                "filter": [
                    {
                        "property": "number"
                    }
                ],
                "stateId": "contacts"
            }
        }
    ]
}

Is there a possibility to achieve this?有没有可能实现这一目标?

My approach:我的做法:

String jsonStringValue = ... // Contains JSON content of a previous request
HttpServletResponse resp = ...
List<Event> events = ...
OutputStream os = resp.getOutputStream();
Map<String, Boolean> config = new HashMap<String, Boolean>();
if (prettyPrint) {
    config.put(JsonGenerator.PRETTY_PRINTING, Boolean.TRUE);
}
JsonGeneratorFactory jgf = Json.createGeneratorFactory(config);
JsonGenerator jg = jgf.createGenerator(os);

if (events.size() > 1) {
    jg.writeStartArray();
}

// Some generic stuff happens here which is based on the 'events' list

jg.writeStartObject();
jg.write(JsonConstants.FILTERS, jsonStringValue);
jg.writeEnd();

if (events.size() > 1) {
    jg.writeEnd();
}

But this ends up into a field which simply contains the String value in quotes.但这最终会变成一个只包含引号中的字符串值的字段。

You can create a JSON Object as below statically您可以静态创建一个 JSON 对象,如下所示

{
    "newValue": "someValue",
    "storedFilters": []
}

Then you can add the javax.json.stream.JsonGenerator generated value to the JSON Array storedFilters dynamically.然后,您可以将javax.json.stream.JsonGenerator生成的值动态添加到 JSON Array storedFilters

You could try below implementation, if it works for you.如果它适合您,您可以尝试以下实现。

String str = "[\n" + "    {\n" + "        \"ref\": \"idValue\",\n" + "        \"data\": {\n"
                + "            \"filter\": [\n" + "                {\n"
                + "                    \"property\": \"number\"\n" + "                }\n" + "            ],\n"
                + "            \"stateId\": \"contacts\"\n" + "        }\n" + "    }\n" + "]";
        JsonFactory factory = new JsonFactory();
        StringWriter jsonObjectWriter = new StringWriter();
        JsonGenerator generator = factory.createJsonGenerator(jsonObjectWriter);

        generator.useDefaultPrettyPrinter(); // pretty print JSON

        generator.writeStartObject();
        generator.writeFieldName("newValue");
        generator.writeString("someValue");
        generator.writeFieldName("storedFilters");
        generator.writeRawValue(str);
        generator.writeEndObject();
        generator.close(); // to close the generator
        System.out.println(jsonObjectWriter.toString());

Output:输出:

{
  "newValue": "someValue",
  "storedFilters": [
    {
      "ref": "idValue",
      "data": {
        "filter": [
          {
            "property": "number"
          }
        ],
        "stateId": "contacts"
      }
    }
  ]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM