杰克逊定制解串器映射

时间:2014-01-11 15:19:20

标签: java jackson deserialization

我需要反序列化一些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"
        }
}

2 个答案:

答案 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;
}