如果我无法使用注解标记该类,如何在反序列化期间为该类自定义json包装键?

时间:2018-10-29 13:42:35

标签: java jackson deserialization wrapper

我有这样的模型课:

import org.codehaus.jackson.map.*;

public class MyPojo {
    int id;
    public int getId()
    { return this.id; }

    public void setId(int id)
    { this.id = id; }


}

并且json json的格式如下:

{ 
    "root":{  
       "MyPojo":{  
          "id":4
       }
    }
}   

我通过注解@JsonTypeInfo@JsonRoot来了解解决方案,但是由于我从图书馆学到了此类,所以我无法应用它。

我也阅读了有关这样的解决方案:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

但是我不能使用它,因为:
1.该设置适用于所有班级,但现在我只需要更改1个班级的行为
2.它将检查根密钥是否与类名(在我的情况下为mypojo)相对,但对我来说不是真的。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

此处的方法是添加自定义解串器。您可以在那里编程编程操作json以创建您的MyPojo实例

public class MyPojoDeserializer extends StdDeserializer<MyPojo> {

    @Override
    public Item deserialize(JsonParser jp, DeserializationContext ctxt) {
        JsonNode node = jp.getCodec().readTree(jp);
        return new MyPojo(node.get("root").get("MyPojo").get("id").numberValue());
    }
}

然后注册反序列化器

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(MyPojo.class, new MyPojoDeserializer());
mapper.registerModule(module);