0

我有一个像这样的 json 文件,需要由 Jackson 将其转换为 Java 用户实例。

"userid" : "1",
"myMixes" : [ {
     "data" : {
       "id" : 1,
       "ref": "my-Object-instance"
     },
     "type" : "object"
   }, {
     "data" : [ [ 0, 1], [ 1, 2 ] ],
     "type" : "list"
   }]

我在我的班级“用户”中有这个:

    // jackson should use this, if type="list"
    @JsonProperty("data")
    public List<List<Integer>> data_list = new ArrayList<>();

    // jackson should use this, if type="object"
    @JsonProperty("data")
    public Data data_object;

    @JsonProperty("id")
    public String id;

    // if type = "object", then jackson should convert json-data-property to Java-Data-Instance
// if type = "list",then jackson should convert json-data-property to List<List<Integer>> data
    @JsonProperty("type")
    public String type;

我如何告诉杰克逊生成 json-data-property 的数据实例,如果 json-type-property 的值被称为“对象”并生成一个 List-Instance,如果 json-type-property 的值被调用“列表”。

4

2 回答 2

1

我想,我找到了最好的解决方案:

@JsonCreator
    public MyMixes(Map<String,Object> props)
    {
        ...

        ObjectMapper mapper = new ObjectMapper();

        if(this.type.equals("object")){

            this.data_object = mapper.convertValue(props.get("data"), Data.class);
        }
        else{
            this.data = mapper.convertValue(props.get("data"), new TypeReference<List<List<Integer>>>() { });
        }

    } 

如果有人有更短/更快的方式,请告诉我。

于 2017-06-04T17:55:41.783 回答
0

您可以编写自己的反序列化程序来检查接收到的 json 的类型属性值。就像是:

@JsonDeserialize(using = UserDeserializer.class)
public class UserData {
    ...
}



public class UserDeserializer extends StdDeserializer<Item> { 

public UserDeserializer() { 
    this(null); 
} 

public UserDeserializer(Class<?> vc) { 
    super(vc); 
}

@Override
public UserData deserialize(JsonParser jp, DeserializationContext ctxt) 
  throws IOException, JsonProcessingException {
    JsonNode node = jp.getCodec().readTree(jp);
    String type = node.get("type");
    if(type.equals("object")){
    // deserialize object
    }else if(type.equals("list")){
    // deserialize list
    }
    return new UserData(...);
   }
}
于 2017-06-04T16:42:26.920 回答