将字符串转换为DTO列表



我有一个简单的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。

最新更新