使用 Jackson 将 Json 数组映射到 POJO
Mapping Json Array to POJO using Jackson
我有一个 JSON 形式的数组:
[
[
1232324343,
"A",
"B",
3333,
"E"
],
[
12345424343,
"N",
"M",
3133,
"R"
]
]
我想使用 Jackson 库将父数组的每个元素映射到 POJO。我试过这个:
ABC abc = new ABC();
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(data).get("results");
if (jsonNode.isArray()) {
for (JsonNode node : jsonNode) {
String nodeContent = mapper.writeValueAsString(node);
abc = mapper.readValue(nodeContent,ABC.class);
System.out.println("Data: " + abc.getA());
}
}
其中 ABC 是我的 POJO class 而 abc 是对象,但我得到以下异常:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.demo.json.model.ABC
编辑:
我的 POJO 看起来像这样:
class ABC{
long time;
String a;
String b;
int status;
String c;
}
有人可以为此提出解决方案吗?
编辑 2:在 Whosebug 和其他论坛上查阅了很多答案后,我找到了一个解决方案。我将 readValue() 方法的返回值映射到一个 POJO 对象数组中。
ABC[] abc = mapper.readValue(nodeContent, ABC[].class);
但现在我得到一个单独的异常
Can not construct instance of ABC: no long/Long-argument constructor/factory method to deserialize from Number value (1552572583232)
我尝试了以下但没有任何效果:
1. 使用
强制 Jackson 对长值使用整数
mapper.configure(DeserializationFeature.USE_LONG_FOR_INTS, true);
2。在 POJO
中使用包装器 class Long 而不是 long
谁能帮我解决这个问题?
您的 json 没有映射到您定义的 pojo。对于您定义的 pojo,json 应该是下面的形式。
{
"time:1232324343,
"a":"A",
"b":"B",
"status":3333,
"c":"E"
}
您可以为此对象使用 ARRAY
形状。您可以使用 JsonFormat
注释来做到这一点:
@JsonFormat(shape = Shape.ARRAY)
class ABC {
反序列化:
ABC[] abcs = mapper.readValue(json, ABC[].class);
修改问题后进行编辑。
您的示例代码可能如下所示:
JsonNode jsonNode = mapper.readTree(json);
if (jsonNode.isArray()) {
for (JsonNode node : jsonNode) {
String nodeContent = mapper.writeValueAsString(node);
ABC abc = mapper.readValue(nodeContent, ABC.class);
System.out.println("Data: " + abc.getA());
}
}
我们可以使用convertValue
方法并跳过序列化过程:
JsonNode jsonNode = mapper.readTree(json);
if (jsonNode.isArray()) {
for (JsonNode node : jsonNode) {
ABC abc = mapper.convertValue(node, ABC.class);
System.out.println("Data: " + abc.getA());
}
}
甚至:
JsonNode jsonNode = mapper.readTree(json);
ABC[] abc = mapper.convertValue(jsonNode, ABC[].class);
System.out.println(Arrays.toString(abc));
我有一个 JSON 形式的数组:
[
[
1232324343,
"A",
"B",
3333,
"E"
],
[
12345424343,
"N",
"M",
3133,
"R"
]
]
我想使用 Jackson 库将父数组的每个元素映射到 POJO。我试过这个:
ABC abc = new ABC();
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(data).get("results");
if (jsonNode.isArray()) {
for (JsonNode node : jsonNode) {
String nodeContent = mapper.writeValueAsString(node);
abc = mapper.readValue(nodeContent,ABC.class);
System.out.println("Data: " + abc.getA());
}
}
其中 ABC 是我的 POJO class 而 abc 是对象,但我得到以下异常:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.demo.json.model.ABC
编辑: 我的 POJO 看起来像这样:
class ABC{
long time;
String a;
String b;
int status;
String c;
}
有人可以为此提出解决方案吗?
编辑 2:在 Whosebug 和其他论坛上查阅了很多答案后,我找到了一个解决方案。我将 readValue() 方法的返回值映射到一个 POJO 对象数组中。
ABC[] abc = mapper.readValue(nodeContent, ABC[].class);
但现在我得到一个单独的异常
Can not construct instance of ABC: no long/Long-argument constructor/factory method to deserialize from Number value (1552572583232)
我尝试了以下但没有任何效果: 1. 使用
强制 Jackson 对长值使用整数mapper.configure(DeserializationFeature.USE_LONG_FOR_INTS, true);
2。在 POJO
中使用包装器 class Long 而不是 long谁能帮我解决这个问题?
您的 json 没有映射到您定义的 pojo。对于您定义的 pojo,json 应该是下面的形式。
{
"time:1232324343,
"a":"A",
"b":"B",
"status":3333,
"c":"E"
}
您可以为此对象使用 ARRAY
形状。您可以使用 JsonFormat
注释来做到这一点:
@JsonFormat(shape = Shape.ARRAY)
class ABC {
反序列化:
ABC[] abcs = mapper.readValue(json, ABC[].class);
修改问题后进行编辑。
您的示例代码可能如下所示:
JsonNode jsonNode = mapper.readTree(json);
if (jsonNode.isArray()) {
for (JsonNode node : jsonNode) {
String nodeContent = mapper.writeValueAsString(node);
ABC abc = mapper.readValue(nodeContent, ABC.class);
System.out.println("Data: " + abc.getA());
}
}
我们可以使用convertValue
方法并跳过序列化过程:
JsonNode jsonNode = mapper.readTree(json);
if (jsonNode.isArray()) {
for (JsonNode node : jsonNode) {
ABC abc = mapper.convertValue(node, ABC.class);
System.out.println("Data: " + abc.getA());
}
}
甚至:
JsonNode jsonNode = mapper.readTree(json);
ABC[] abc = mapper.convertValue(jsonNode, ABC[].class);
System.out.println(Arrays.toString(abc));