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

How to parse raw values from JSON array items with Jackson?

使用 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]);
}

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

需要注意一件事 - 格式与您预期的不同。 JsonNode 有两种方法 - toString() 删除所有白色 space 和 toPrettyString 将白色 space 和换行符添加到最后的 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]);