如何使用 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 数组?