gpt4 book ai didi

java - spring restTemplate动态映射

转载 作者:行者123 更新时间:2023-11-30 10:23:02 24 4
gpt4 key购买 nike

我正在使用 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;
}

如果所有的值都是字符串类型,那么我可以这样做:

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"

处理这种情况的推荐方法是什么?

最佳答案

我会在这里推荐 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。

关于java - spring restTemplate动态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47262518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com