我需要反序列化一些json,它可以包含一个对象数组[{},{}]或一个对象{}。查看我的question。这是我正在尝试做的事情:
public class LocationDeserializer extends JsonDeserializer<List<Location>>{
@Override
public List<Location> deserialize(JsonParser jp,
DeserializationContext ctxt) throws IOException
{
List<Location> list = new ArrayList<Location>();
if(!jp.isExpectedStartArrayToken()){
list.add(...);
}else{
//Populate the list
}
return list;
}
但是我被困在这里了。如何重新映射对象?如何告诉杰克逊将这个解串器用于“位置”属性?
以下是Json的表现:
{
"location":
[
{
"code":"75",
"type":"1"
},
{
"code":"77",
"type":"1"
}
]
}
或
{
"location":
{
"code":"75",
"type":"1"
}
}
答案 0 :(得分:0)
我不知道您的JSON是什么样的,但我认为使用ObjectNode比使用JsonDeserializer
要容易得多。像这样:
ObjectNode root = mapper.readTree("location.json");
if (root.getNodeType() == JsonNodeType.ARRAY) {
//Use a get and the JsonNode API to traverse the tree to generate List<Location>
}
else {
//Use a get and the JsonNode API to traverse the tree to generate single Location or a one-element List<Location>
}
答案 1 :(得分:0)
您可以告诉Jackson将此反序列化器与注释JsonDeserialize一起使用。
在deserialize方法中,您可以使用以下内容:
@Override
public List<Location> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
List<Location> list = new ArrayList<Location>();
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jp);
if(root.get("location").isArray()){
// handle the array
}else{
// handle the single object
}
return list;
}