【问题标题】:Read the outer-most JSON object but not the inner ones using Jackson?使用 Jackson 读取最外层的 JSON 对象而不是内部的对象?
【发布时间】:2021-02-16 10:24:35
【问题描述】:

这类似于this 问题,但有一点不同。

假设我有一个这样定义的 json 文档:

[
    { "type" : "Type1", 
      "key1" : "value1" },
    { "type" : "Type2", 
      "key2" : "value2" }
]

我想将此 json 文档读入字符串列表 (List<String>)。我只想将最外层的列表读入 Java List,列表中的 json 对象应该保留在列表中。结果应该与此等效(我忽略换行符等):

var myList = List.of("{\"type\": \"Type1\", \"key1\": \"value1\"}, {\"type\": \"Type2\", \"key2\": \"value2\"}")

请注意,我想创建任何 DTO 来保存一些中间表示。我只想“按原样”表示“列表”下方的所有内容。

我怎样才能做到这一点?

我使用的是 Jackson 2.12.1。

【问题讨论】:

    标签: java json jackson jackson-databind


    【解决方案1】:

    如果您不想在 DTO 中保留中间表示,那么可以实现所需反序列化的一种方法是:

    // Create a ObjectMapper (of type com.fasterxml.jackson.databind.ObjectMapper)
    ObjectMapper mapper = new ObjectMapper();
    // Read the json string into a List. This will be deserialized as a collection of LinkedhashMap
     List<LinkedHashMap> list = mapper.readValue(getInputString(), List.class);
    //Iterate over the deserialized collection and create a JSONObject from every LinkedHashMap
     List<String> result = list.stream()
                               .map(map -> new JSONObject(map).toString())
                               .collect(Collectors.toList());
    

    这将产生:

    [{"key1":"value1","type":"Type1"}, {"key2":"value2","type":"Type2"}]
    

    这种方法的缺点是,它会影响性能。

    【讨论】:

    • 谢谢,但是从性能的角度来看这不是很糟糕吗?它会将其转换为“Map”,然后转换为“JsonObject”,然后再转换回(json)字符串。我认为这样的事情可以做得更快,因为要解析的数据更少(只是外部列表)。
    • 是的,这是这种方法的缺点。如果有 DTO,则可以避免这种情况,通过 @JsonIgnoreProperties 注释可以避免不需要反序列化的特定字段
    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2020-11-29
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多