杰克逊处理JSON数据:无法识别的字段,未标记为可忽略

993

我需要将特定的JSON字符串转换为Java对象。我正在使用Jackson来处理JSON。输入JSON不受我的控制(我从Web服务中读取)。这是我的输入JSON:

{"wrapper":[{"id":"13","name":"Fred"}]}

以下是一个简化的使用案例:

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

我的实体类是:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

我的包装类基本上是一个容器对象,用于获取我的学生列表:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

我一直收到这个错误,而“wrapper”返回null。我不确定缺少了什么。可以有人帮忙吗?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

3
我发现这个很有用,可以避免创建一个包装类:Map dummy<String,Student> = myClientResponse.getEntity(new GenericType<Map<String, Student>>(){}); 然后 Student myStudent = dummy.get("wrapper"); - pulkitsinghal
9
JSON应该长这样:String jsonStr = "{"students":[{"id":"13","name":"Fred"}]}"; 如果你期望在REST POST请求中接收封装对象。 - Dmitri Algazin
4
相关(但不同)问题:使用Jackson忽略JSON对象上的新字段 - sleske
6
顺便说一下,大多数回答这个问题的答案实际上回答了一个不同的问题,即类似于我链接的那个问题。 - sleske
8
大多数答案只是帮助掩盖问题,而不是真正解决它 :( - NoobEditor
显示剩余2条评论
51个回答

1
在我的情况下,我需要添加公共的getter和setter来保留字段的私有性。
ObjectMapper mapper = new ObjectMapper();
Application application = mapper.readValue(input, Application.class);

我使用的是 jackson-databind 2.10.0.pr3 。

0

您的JSON字符串与映射类不匹配。请更改输入字符串。

String jsonStr = "{\"students\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";

或者更改您映射的类

public class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

0

将包装类更改为

public Class Wrapper {

          @JsonProperty("wrapper")  // add this line
          private List<Student> students;
}

这段代码的作用是将 JSON 对象中的 students 字段识别为 wrapper 键。
此外,我个人更喜欢使用 Lombok Annotations 来生成 Getter 和 Setter。
@Getter
@Setter
public Class Wrapper {

          @JsonProperty("wrapper")  // add this line
          private List<Student> students;
}

由于我还没有测试过使用 Lombok 和 @JsonProperty 的上述代码,因此我建议您将以下代码添加到包装器类中,以覆盖 Lombok 的默认 getter 和 setter。

public List<Student> getWrapper(){
     return students;
}

public void setWrapper(List<Student> students){
     this.students = students;
}

同时,也可以查看this,使用Jackson进行列表反序列化。


0

Json 字段:

 "blog_host_url": "some.site.com"

Kotlin字段

var blogHostUrl: String = "https://google.com"

在我的情况下,我只需要在我的数据类中使用@JsonProperty注释。
例如:
data class DataBlogModel(
       @JsonProperty("blog_host_url") var blogHostUrl: String = "https://google.com"
    )

以下是文章链接:https://www.baeldung.com/jackson-name-of-property


0
ObjectMapper objectMapper = new ObjectMapper()
.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);

嗨,感谢您的回答。 如果您能在发布的代码中添加一些详细信息,那就太好了。 您想要实现什么,背后的原因是什么?发布代码很好,但稍微加点描述会极大地帮助那些提问的人。 - Ema.jar

0

以下是我尝试压制不想解析的未知属性的 Kotlin 代码分享。

val myResponse = jacksonObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .readValue(serverResponse, FooResponse::class.java)

0
根据此文档,您可以使用Jackson2ObjectMapperBuilder构建您的ObjectMapper:
@Autowired
Jackson2ObjectMapperBuilder objectBuilder;

ObjectMapper mapper = objectBuilder.build();
String json = "{\"id\": 1001}";

默认情况下,Jackson2ObjectMapperBuilder禁用了未识别属性异常错误。


0
你应该将 List 中的字段从 "students" 改为 "wrapper",然后 json 文件和映射器就会查找它。

0

我曾经遇到过这个问题,当时我的JSON负载包含了一个API无法识别的属性。解决方案是重命名或删除有问题的属性。


0

在我的情况下,错误是由以下原因引起的

  • 最初它运行良好,然后我重命名了一个变量,在代码中进行了更改,然后它给了我这个错误。

  • 然后我也应用了Jackson忽略属性,但它没有起作用。

  • 最终,根据我的变量名称重新定义我的getter和setter方法后,这个错误得到了解决。

因此,请确保重新定义getter和setter方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接