【问题标题】:How to parse raw values from JSON array items with Jackson?如何使用 Jackson 解析 JSON 数组项中的原始值?
【发布时间】: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 结构时能够正常处理它。

标签: java json jackson deserialization json-deserialization


【解决方案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]);

【讨论】:

  • 谢谢!实际上我最终得到了类似的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多