我有一个简单的DTO:
public class DtoParamField {
private String name;
private Object value;
private DtoParamField(String name, Object value) {
this.name = name;
this.value = value;
}
我预计它会以JSON的形式接收,如下所示:
{
"field1": "value1",
"field2": "field2",
"params": [{name="1", value="123"}, {name="2", value="123"}]
}
将params
属性映射为DToParamField
列表的最快、最简单的方法是什么?
如果我理解正确,您只对JSON数组params
中包含的数据感兴趣。
您可以通过以下步骤解决问题:
- 提取与JSON输入中的
params
属性相对应的JsonNode
。为此,可以使用ObjectMapper.readTree()
并应用get()
从树中获取特定节点 - 然后将
JsonNode
解析为列表list。为此,您可以使用ObjectReader.readValue()
这就是它的样子:
String myJson = """
{
"field1":"value1",
"field2":"field2",
"params":[
{
"name":"1",
"value":"123"
},
{
"name":"2",
"value":"123"
}
]
}
""";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(myJson).get("params");
ObjectReader reader = mapper.readerFor(new TypeReference<List<DtoParamField>>() {});
List<DtoParamField> params = reader.readValue(node);
params.forEach(System.out::println);
输出:
Test.DtoParamField(name=1, value=123)
Test.DtoParamField(name=2, value=123)
注意为了成功构建您的DTO实例,Jackson需要:
设置器和在
DtoParamField
类中没有提供args构造函数。或者,您需要在上应用一些数据绑定注释,以使现有的all-args构造函数符合Jackson使用的条件,特别是constractor上的
@JsonCreator
和每个参数上的@JsonProperty
。这种方法允许具有final
字段(这在setter中是不可能的(。
创建setter和无args构造函数是微不足道的,后一个选项看起来就是这样:
public static class DtoParamField {
private String name;
private Object value;
@JsonCreator
private DtoParamField(
@JsonProperty("name") String name,
@JsonProperty("value") Object value) {
this.name = name;
this.value = value;
}
// getters, etc.
}
还要注意,为了将DtoParamField
序列化为JSON(如果需要(,您需要getter。