如何使用 Jackson 解析 JSON 数组项中的原始值?

Posted

技术标签:

【中文标题】如何使用 Jackson 解析 JSON 数组项中的原始值?【英文标题】:How to parse raw values from JSON array items with Jackson? 【发布时间】:2022-01-05 02:15:04 【问题描述】:

使用 Jackson 反序列化,有一个选项会很棒 将 JSON 项目数组(任何性质:对象、数字、字符串)反序列化为 Java 字符串数组

我看到@JsonRawValue 允许为嵌套字段提供类似的功能。 是否可以为“***”对象实现相同的功能?

void test()
    var payload = """ [
          "a": 1, "b": "hello",
          "a": 2, "b": "bye",
          "something"
    ]
    """;

    // What else is required to get the effect of @JsonRawValue ?

    String[] rawItems = new ObjectMapper().readValue(payload, String[].class);

    assertEquals(""""a": 1, "b": "hello"""", rawItems[0]);
    assertEquals(""""a": 2, "b": "bye"""", rawItems[1]);
    assertEquals("\"something\"", rawItems[2]);

【问题讨论】:

杰克逊会允许这种格式错误的 JSON 吗? something 不是键值对,不是吗?还是您对允许此类字符串也有疑问? @SreeKumar 根据规范,这是一个有效的 JSON。我希望 Jackson 至少在将其解析为 JsonNode 结构时能够正常处理它。 【参考方案1】:

您可以将payload 转换为com.fasterxml.jackson.databind.node.ArrayNode,然后遍历元素(在本例中为JsonNode)并将它们添加到List<String>(如果需要,您可以随后将其转换为String[])。

需要注意的一件事 - 格式不会像您期望的那样。 JsonNode 有两种方法 - toString() 删除所有空格,toPrettyString 在最后的 String 中添加空格和换行符

        String payload = """ 
        [
          "a": 1, "b": "hello",
          "a": 2, "b": "bye",
          "something"
        ]
        """;
        ArrayNode items = new ObjectMapper().readValue(payload, ArrayNode.class);

        List<String> rawItemsList = new ArrayList<>();

        for (JsonNode jsonNode : items) 
            rawItemsList.add(jsonNode.toString());
        

        // You can just keep using the rawItemsList, but I've converted it to array since the question mentioned it
        String[] rawItemsArr = rawItemsList.toArray(new String[0]);

        assertEquals("""
                "a":1,"b":"hello"""", rawItemsArr[0]);
        assertEquals("""
                "a":2,"b":"bye"""", rawItemsArr[1]);
        assertEquals("\"something\"", rawItemsArr[2]);

【讨论】:

谢谢!实际上我最终得到了类似的解决方案。

以上是关于如何使用 Jackson 解析 JSON 数组项中的原始值?的主要内容,如果未能解决你的问题,请参考以下文章

使用Jackson“意外令牌(START_OBJECT)使用LocalDateTime将JSON解析为POJO,预期VALUE_STRING:预期的数组或字符串。”

@RequestBody jackson解析复杂的传入值的一个坑;jackson解析迭代数组;jackson多重数组;jakson数组

如何使用 Jackson 反序列化来自 json 对象的对象数组

如何使用 Retrofit 和 Jackson 读取嵌套的 JSON 数组?

将JSON转换为Java Object,如何使用Jackson解析BadgerFish约定

jackson 解析json ,使用注解