使用Jackson将Json数组映射到POJO

时间:2019-03-20 09:02:15

标签: java json jackson-databind

我有以下形式的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类,而abc是对象,但是出现以下异常:

  

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化com.demo.json.model.ABC实例

编辑: 我的POJO看起来像这样:

class ABC{
    long time;
    String a;
    String b;
    int status;
    String c;
}

有人可以为此提出建议吗?

编辑2:在StackOverflow和其他论坛上咨询了很多答案之后,我遇到了一个解决方案。我将readValue()方法的返回值映射到一个POJO对象数组中。

ABC[] abc = mapper.readValue(nodeContent, ABC[].class);

但是现在我得到了一个单独的例外

  

无法构造ABC实例:没有长/长参数构造函数/工厂方法可从Number值反序列化(1552572583232)

我尝试了以下操作,但没有任何效果: 1.强制Jackson使用

将整数用于长值
mapper.configure(DeserializationFeature.USE_LONG_FOR_INTS, true);

2。使用包装器类Long代替POJO中的long

有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

您可以为该对象使用const playersByTeam = teamsAndPlayers.find(({ team }) => team === selectedTeam).players <select id="players" name="players"> { playersByTeam.map(player => <option key={player>{ player }</option>) } </select> 形状。您可以使用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());
    }
}

答案 1 :(得分:1)

您的json没有映射到您定义的pojo。对于您定义的pojo,json应该采用以下形式。

{ 
  "time:1232324343,
  "a":"A",
  "b":"B",
  "status":3333,
  "c":"E"
}