【问题标题】:Json Jackson won't unwrap root elementJson Jackson 不会展开根元素
【发布时间】:2022-12-15 11:57:21
【问题描述】:

一段时间以来,我一直在尝试反序列化一组 json 对象,但互联网上的所有答案要么已弃用,要么对我不起作用。

下面的代码总是返回错误信息:

...MismatchedInputException: Root name ('builders') does not match expected ('Builder[]') for type `[LModel.Attributes.Builder;`

以下是我的 DTO 代码:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;

@JsonRootName("builders")
public class Builder {
    private  String id;
    private  String builder;

    @JsonProperty("id")
    public void setId(String id) {
        this.id = id;
    }

    @JsonProperty("name")
    public void setBuilder(String builder) {
        this.builder = builder;
    }

    public String getBuilder() {
        return builder;
    }

    public String getId(){
        return id;
    }
}

在这里我们有我们的反序列化器:

var json = response.body();


mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
var builders = mapper.readValue(json, Builder[].class);

这是我的 JSON:

{
    "builders": [
        {
            "id": 1,
            "name": "Haley LLC"
        },
        {
            "id": 2,
            "name": "Stoltenberg, Mayert and Weimann"
        },
        {
            "id": 3,
            "name": "Ziemann Group"
        },
        {
            "id": 4,
            "name": "Monahan - Torp"
        },
        {
            "id": 5,
            "name": "Fritsch, Harber and Lemke"
        }
    ]
}

【问题讨论】:

    标签: java json jackson deserialization


    【解决方案1】:

    你能试试包装类吗:

    public class Builder{
        public int id;
        public String name;
    }
    
    public class Root{
        public ArrayList<Builder> builders;
    }
    
    ObjectMapper mapper = new ObjectMapper();
    Root root = mapper.readValue(strJson, Root.class);
    

    【讨论】:

    • 这可行,但我想避免为每个不同的 JSON 对象创建多个“根”类。
    【解决方案2】:

    如果只有一个对象而不是 JSON 数组,注释 @JsonRootName 将按预期工作。在这种情况下,我们需要一种不同的方法。

    您可以使用ObjectMapper.readerFor( TypeReference )方法指定List&lt;Builder&gt;类型的TypeReference来准备ObjectReader

    为了打开这个 JSON 数组,我们可以使用 ObjectReader.withRootName() 方法。

    @JsonRootName 不是必需的,您可以删除它,如果您没有其他情况将单个 Builder 对象包装在 JSON 中。

    它可能是这样的:

    String json6 = """
        {
            "builders": [
                {
                    "id": 1,
                    "name": "Haley LLC"
                },
                ... // other elements
            ]
        }
        """;
            
    ObjectMapper mapper = new ObjectMapper();
        
    ObjectReader objectReader = mapper
        .readerFor(new TypeReference<List<Builder1>>() {})
        .withRootName("builders");
            
    List<Builder1> builders = objectReader.readValue(json6);
            
    builders.forEach(System.out::println);
    

    输出:

    Builder{id='1', builder='Haley LLC'}
    Builder{id='2', builder='Stoltenberg, Mayert and Weimann'}
    Builder{id='3', builder='Ziemann Group'}
    Builder{id='4', builder='Monahan - Torp'}
    Builder{id='5', builder='Fritsch, Harber and Lemke'}
    

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2018-03-22
      • 2017-11-21
      • 1970-01-01
      • 2012-02-08
      • 2012-07-27
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多