使用 Jackson 反序列化 JSON 的问题

Posted

技术标签:

【中文标题】使用 Jackson 反序列化 JSON 的问题【英文标题】:Issue with deserializing JSON using Jackson 【发布时间】:2017-06-25 18:57:19 【问题描述】:

我有这样的 JSON

"body":"result":["crossStateId":1,"raceId":181564,"withOfficer":1,"documents":["indexed":0,"documentNumber":"zzz","isMain":1,"documentTypeId":6,"serverId":16,"countryId":327,"useDate":"2017-02-07T19:31:51.000+0000","documentSubTypeId":6,"crossId":5018177,"documentId":44973231,"personId":222,"infinity":0,"documentValid":"2023-08-25T20:00:00.000+0000"],"directionId":2,"documentNumber":"sss","operatorUsername":"AIRPORT_84","crossDate":"2017-02-07T19:31:51.000+0000","serverId":16,"crossTypeId":1,"crossRegisterDate":"2017-02-07T19:31:52.818+0000","officerNote":"","children":[],"personNote":"","crossId":5018177,"workplaceId":82,"divisionId":2,"race":"carriageContainer":0,"raceId":181564,"raceStateId":1,"directionId":2,"creatorId":415,"countryId":327,"transportIdByType":605,"raceDateTime":"2017-02-07T19:20:58.000+0000","raceNumber":"841 sss sss","creatorUsername":"AIRPORT_8","divisionId":2,"transportTypeId":3,"createDate":"2017-02-07T19:20:58.000+0000","syncState":0,"autos":[],"userId":491,"raceNumber":"841 sss sss","operatorNote":"","person":"firstNameEn":"JUMBERI","indexed":1,"lastNameGe":"ჩოხელი","genderId":2,"personId":6027803,"personalNumber":"222","countryNameGe":"sss","birthDate":"1963-06-14T20:00:00.000+0000","lastNameEn":"sss","countryId":327,"firstNameGe":"sss","airplane":"raceNumber":"841 sss sss","airCompanyId":1,"airplaneId":605,"airportId":5657,"bortNumber":"01","transportSubTypeId":78,"countryId":360,"underAge":0,"personId":6027803,"decisionId":22],"total":8264,"errorCode":0

我想将它反序列化为 Java 类,但我只对一些 JSON 字段感兴趣。无论如何,这里是模型类:

public class Response implements Serializable 
    private Body body;
    private long errorCode;



public class Body implements Serializable 
    Result result[];


public class Result implements Serializable 

    private long crossStateId;
    private long raceId;

    private Person person;
    private Child children [];
    private Auto autos[];


等等

但由于某种原因,我得到以下异常:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 无法识别的字段“body”(com.demo.Response 类),未标记为 [来源:java.io.StringReader@6483f5ae;行:1,列: 10](通过引用链:com.demo.Response["body"])

这里是代码(正确接收到 JSON 字符串,格式与我一开始提到的相同):

 String res = MainProgram.sendGet("someURL");

 ObjectMapper objectMapper = new ObjectMapper();
 Response ob = objectMapper.readValue(res, Response.class);

我将不胜感激。

【问题讨论】:

你可以告诉杰克逊忽略未知属性。 Object result: Array[1], total: 8264 您在 Body 类中缺少总数。 @Thomas 是的,但在这种情况下,Jackson 的哪个属性是未知的? 向你的字段添加 geters 和 setter,它可能会有所帮助 为你想要的属性添加@JsonProperty,为不需要的属性添加@JsonIgnore 【参考方案1】:

正如其他人所提到的,private 字段默认情况下不会自动检测,因此:

@JsonProperty OR 注释字段 添加二传手

需要用于反序列化。

但是,还有另一种可能性:您可以使用注释 @JsonAutoDetect 来更改所需的最低可见性,并在此处启用所有字段的发现。 或者您甚至可以通过ObjectMapper 方法更改使用的默认值(类似于setVisibility(...))。

【讨论】:

【参考方案2】:

您需要为字段创建 getter 和 setter,并且应该为字段添加注释。

注释:

@JsonProperty(value = "body")
private Body body;

执行上述任一操作即可。

旁注:

您可以使用 http://www.jsonschema2pojo.org/ 自动从 json 创建您的 pojo。只需将其粘贴并下载,或使用他们的插件之一。

【讨论】:

还添加了这个 atm:@JsonIgnoreProperties(value = "extra", "uselessValue",ignoreUnknown = true )

以上是关于使用 Jackson 反序列化 JSON 的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jackson 反序列化 JSON - 为啥 JsonMappingException“没有合适的构造函数”?

使用 Jackson 反序列化:获取 Json 对象设置的字段列表

在使用 Jackson 反序列化期间选择性地忽略 JSON 属性

json之jackson序列化反序列化探究(二)

无法使用泛型使用 Jackson 反序列化动态 json

在scala中使用jackson反序列化json