我有一个类似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;
}
答案 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)