使用Jackson在反序列化JSON数组中反序列化JSON数组

时间:2020-07-10 06:36:42

标签: java json jackson

我有一个类似JSON的结构:

{
  "id" : "123",
  "name" : [ {
    "id" : "234",
    "stuff" : [ {
      "id" : "345",
      "name" : "Bob"
    }, {
      "id" : "456",
      "name" : "Sally"
    } ]
  } ]
}

我想映射到以下数据结构:

Class01

@Getter
public class Class01{
    private String id;
    @JsonDeserialize(using = Class01HashMapDeserialize.class)
    private ArrayList<Class02> name;
}

Class02

@Getter
public class Class02{
    private String id;
    private ArrayList<Class03> stuff;
}

Class03

@Getter
public class Class03{
    private String id;
    private String name;
}

在我的主要方法im中,使用带有objectMapper.readValue(jsonString,new TypeReference<ArrayList<Class02>>(){})的ObjectMapper将此JSON映射到我的Class01。该类成功地将Class02数组分解为名称数组。

当涉及第二个数组时,我不知道如何进一步反序列化,因为我无法从class02条目中访问json文本。

@Override
public ArrayList<Class02> deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
    ArrayList<Class02> ret = new ArrayList<Class02>();

    ObjectCodec codec = parser.getCodec();
    TreeNode classes02 = codec.readTree(parser);

    if (classes02.isArray()) {
        for (JsonNode class02 : (ArrayNode) classes02) {
            if(classe02.get("stuff").isArray()){
                 ObjectMapper objectMapper = new ObjectMapper();
                 ArrayList<Class03> classes03 = objectMapper.readValue(class02.get("stuff").asText(), new TypeReference<ArrayList<Class03>>(){});
            }
            ret.add(new Class02(class02.get("id").asText(), classes03));
        }
    }
    return ret;
}

1 个答案:

答案 0 :(得分:1)

为什么要放置@JsonDeserialize注释?无需任何自定义映射,Jackson就能对它进行反序列化:

@Getter
public class Class01{
    private String id;
    private ArrayList<Class02> name;
}

同样,在第一遍中,我将手动为3个类生成getter / setters / constructor。 Lombok&Jackson可能存在一些问题,一旦使第一个版本的代码生效(Can't make Jackson and Lombok work together),您可能希望稍后解决

您的读者应该更像:

ObjectMapper objectMapper = new ObjectMapper();
String text = ... //Your JSon
Class01 class01 = objectMapper.readValue(text, Class01.class)
相关问题