jackson 将字符串转换为DTO列表

pgvzfuti  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(172)

我有一个简单的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属性Map到DToParamField列表的最快和最简单的方法是什么?

lyr7nygr

lyr7nygr1#

如果我没有理解错的话,您只对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类中提供的 * 设置器 * 和 * 无参数构造函数 *。
  • 或者,您需要在上应用一些数据绑定注解,以使现有的 *all-args构造函数 * 适合Jackson使用,特别是构造函数上的@JsonCreator和每个参数上的@JsonProperty。这种方法允许使用final字段(这在setter中是不可能的)。

创建 settersno-args constructor 非常简单,这就是后一个选项的外观:

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。

相关问题