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