【问题标题】:Copy all values List<String> to Jackson JsonGenerator Array directly instead of looping over it将所有值 List<String> 直接复制到 Jackson JsonGenerator Array 而不是循环遍历它
【发布时间】:2021-09-05 18:55:03
【问题描述】:

我正在使用Jackson JsonGenerator 创建一个JSON 文件,我需要为其添加来自List&lt;String&gt; 的元素。这个ListJSON Fragments 组成,需要添加到我的最终JSON 文件中。

截至目前,我正在循环访问 List&lt;String&gt; 并将它们一一添加到我的 Jackson JsonGenerator writeRaw 中。到目前为止,这一切正常。但是,我的 List 可以有 1000 或更多的值,然后我不希望循环并一一添加。相反,我正在寻找一种方法将数组直接添加到JsonGeneator 数组中。我想知道是否有办法直接复制这样的数组:

jsonGenerator.writeArray("eventList",eventsList);

以下是我目前的代码:

public class JacksonTest {
    public static void main(String[] args) throws IOException {

        List<String> eventsList = new ArrayList<>();
        eventsList.add("{\n" + "  \"isA\": \"Customer\",\n" + "  \"name\": \"Rise Against\",\n" + "  \"age\": \"2000\"\n" + "}");
        eventsList.add("{\n" + "  \"isA\": \"Owener\",\n" + "  \"name\": \"Linkin Park\",\n" + "  \"age\": \"2ßß8\"\n" + "}");
        eventsList.add("{\n" + "  \"isA\": \"Customer\",\n" + "  \"name\": \"Breaking Benjamin\",\n" + "  \"age\": \"2005\"\n" + "}");

        StringWriter jsonObjectWriter = new StringWriter();
        JsonGenerator jsonGenerator = new JsonFactory().createGenerator(jsonObjectWriter).useDefaultPrettyPrinter();
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("schema","2.0");
        jsonGenerator.writeStringField("date","2021-06-22");


        //Current Approach
        jsonGenerator.writeFieldName("eventList");
        jsonGenerator.writeStartArray();

        //Add events from the list one by one
        eventsList.forEach(event -> {
            try {
                jsonGenerator.writeRaw(event + ",");
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

        jsonGenerator.writeEndArray();
        jsonGenerator.writeEndObject();
        jsonGenerator.close();
        jsonGenerator.flush();

        System.out.println(jsonObjectWriter.toString());
    }
}

您可以从上面的代码中观察到,我正在循环遍历 List&lt;String&gt; 并将它们一一添加到 JsonGeneator。有人可以建议是否有办法将List&lt;String&gt; 直接添加到JsonGenerator,这样我就可以跳过looping 部分。

类似的东西在JSONObject这里我们可以直接添加列表:

final JSONObject doc = new JSONObject();
doc.put("schemaVersion", 2.0);
final JSONObject eventListAsJson = new JSONObject();
eventListAsJson.put("eventList", eventsList);
doc.put("eventList", eventListAsJson);

非常感谢任何帮助或建议。

【问题讨论】:

  • writeArray("eventList",eventsList); 这样的调用可能无论如何都会在内部循环,所以你不会在这里获得太多。但是您可以尝试先构建 json 字符串,然后调用 writeRaw(),例如writeRaw(String.join(",", eventsList)).
  • 非常感谢您的回复和您的时间。这也可能会有所帮助,因为我不必在这里明确循环,并且一切都在内部处理。

标签: java arrays json jackson jackson2


【解决方案1】:

正如@Thomas 所指出的,我执行以下操作将LIST 中的元素添加到我的JsonGenerator

jsonGenerator.writeRaw(String.join(",", eventsList));

【讨论】:

    【解决方案2】:
        ObjectNode objectNode = new ObjectMapper().createObjectNode();
        objectNode.put("schema", "2.0");
        objectNode.put("date", "2021-06-22");
    
        ArrayNode arrayNode = new ObjectMapper().createArrayNode();
        for (String s : eventsList) {
            arrayNode.add(new ObjectMapper().readValue(s, ObjectNode.class));
        }
        objectNode.set("eventList", arrayNode);
    
        System.out.println(objectNode.toPrettyString());
    

    【讨论】:

    • 如果您至少添加一些关于您的代码的用途以及它将如何回答问题的解释,那就太好了。您可能还想解决潜在的性能问题,例如ObjectMapper is thread-safe,因此可以而且应该被重用。
    • 感谢您的回复,但正如@Thomas 所提到的,对您试图传达的内容的一些解释将使答案更加清晰,因为您使用的逻辑与我在问题中所要求的逻辑完全不同.另外,我相信这不是我正在寻找的正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多