spring restTemplate动态映射

时间:2017-11-13 10:47:20

标签: java json spring-boot jackson resttemplate

我正在使用spring restTemplate将响应映射到POJO。 其余api的响应是这样的:

"attributes": {
    "name": {
        "type": "String",
        "value": ["John Doe"]
    },
    "permanentResidence": {
        "type": "Boolean",
        "value": [true]
    },
    "assignments": {
        "type": "Grid",
        "value": [{
            "id": "AIS002",
            "startDate": "12012016",
            "endDate": "23112016"
        },{
            "id": "AIS097",
            "startDate": "12042017",
            "endDate": "23092017"
        }]
    }
}  
在父类中,我有:

public class Users {
    private Map<String, Attribute> attributes;
}  

如果所有值都是String类型,那么我可以这样做:

public class Attribute {
    private String type;
    private String[] value;
}  

但价值观的类型不同。所以我想到了以下几点:

public class Attribute {
    private String type;
    private Object[] value;
}  

上述应该有效,但在每一步我都必须找出对象的类型 所以,我的问题是我能有这样的事情:

public class Attribute {

    @JsonProperty("type")
    private String type;

    @JsonProperty("value")
    private String[] stringValues;

    @JsonProperty("value")
    private Boolean[] booleanValues;

    @JsonProperty("value")
    private Assignments[] assignmentValues; // for Grid type
}

但它不起作用并抛出错误:Conflicting setter definitions for property "value"

处理此方案的推荐方法是什么?

1 个答案:

答案 0 :(得分:1)

我会建议Jackson处理多态性的工具:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = BooleanAttribute.class, name = "Boolean"),
        @JsonSubTypes.Type(value = StringAttribute.class, name = "String")
})
class Attribute {
    private String type;
}

class BooleanAttribute extends Attribute {
    private Boolean[] value;
}

class StringAttribute extends Attribute {
    private String[] value;
}

JsonTypeInfo告诉Jackson这是一个基类,类型将由名为"type"的JSON字段确定

JsonSubTypesAttribute的子类型映射到JSON中"type"的值。

如果为Assignments和getters / setters添加适当的子类型,Jackson将能够解析您的JSON。