我正在尝试反序列化包含列表的json对象,其中列表的类型是对象中的属性。即
public class TableOutput
{
private String hash;
private String table; // contains the object type in data list
private List<Object> data;
}
我的一个限制是生成了要反序列化为的bean,但是我无法对其进行修改。我很确定我需要一个自定义的JsonDeserializer解串器。我将反序列化器放在了数据类型上:
@JsonDeserialize(contentAs = TableOutputDeserializer.class)
private List<Object> data;
解串器有效,但问题是我无法从父对象获取table属性。我正在获取TableOutput对象,并且hash属性具有正确的值,但是table属性为null。我只是在猜测,但我认为objectMapper在处理'table'属性之前先处理'data'属性。
这是我的JsonDeserializer:
public class TableOutputDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
// Get reference to ObjectCodec
ObjectCodec codec = jp.getCodec();
// Parse "object" node into Jackson's tree model
JsonNode node = codec.readTree(jp);
// Get the TableOutput object
TableOutput tableOutput=(TableOutput)jp.getParsingContext().getParent().getCurrentValue();
// got a valid tableOutput instance.
String objectType=tableOutput.getTable(); // objectType is always null!!!
Iterator<JsonNode> elements = node.elements();
... more stuff ...
我需要能够获取table属性,以便知道要为列表创建哪种对象。有建议吗?
答案 0 :(得分:0)
也许为对象使用一个通用值。不能肯定地说这将在您的情况下起作用,但是当使用GSON设置我的JSON对象时,我设置了一个通用类,以便当我导入JSON对象时,我可以告诉它要使用哪种对象名单。像
public class JsonClass <T> {
private List<T> unknownItems;
}
然后将其与要在列表中显示的班级一起使用。