java - 使用 Jackson 在 Java 中序列化为 JSON 时出现问题

标签 java json jackson

大家早上好!

我有一个 JSON 字符串,如下所示:

{
   "StatusCode":0,
   "Message":null,
   "ExecutionTime":0,
   "ResponseData":[
        {"Name":"name1","SiteId":"1234","Type":"Type1","X":"1234567","Y":"123456"},
        {"Name":"Name2","SiteId":"2134","Type":"Type2","X":"1234567","Y":"1234567"},
        {"Name":"Name3","SiteId":"3241","Type":"Type3","X":"1234567","Y":"1234567"},
        {"Name":"Name4","SiteId":"4123","Type":"Type4","X":"123456","Y":"123456"}
    ]
}

我想创建一个对象,我可以在其中检索 XY 值。

我一直在尝试使用 Jackson 来序列化 JSON 字符串,但没有成功。我创建了两个额外的类供 Jackson 使用。顶层的一个类,StatusCodeMessageExecutionTimeResponseData 看起来像

public class PL {
private Long statusCode;
private String executionTime;
private String message;
private ResponseData responseData;
public PL(){
}

public void setStatusCode(Long statusCode){
  this.statusCode = statusCode;
}

public Long getStatusCode(){
  return this.statusCode;
}

public void setExecutionTime(String executionTime){
  this.executionTime = executionTime;
}
public String getExecutionTime(){
  return this.executionTime;
}

public void setMessage(String message){
  this.message = message;
}
public String getMessage(){
  return this.message;
}

public void setResponseData(ResponseData responseData){
  this.responseData = responseData;
}
public ResponseData getResponseData(){
  return this.responseData;
}
}

其中 ReponseData 作为对象返回,然后我有另一个用于序列化 ResponseData 的类

public class ResponseData {

private String name;
private String siteId;
private String type;
private String x;
private String y;

public ResponseData(){
}

public void setName(String name){
  this.name = name;
}
public String getName(){
  return this.name;
}

public void setSiteId(String siteId){
  this.siteId = siteId;
}
public String getSiteId(){
  return this.siteId;
}

public void setType(String type){
  this.type = type;
}
public String setType(){
  return this.type;
}

public void setX(String x){
  this.x = x;
}
public String getX(){
  return this.x;
}

public void setY(String y){
  this.y = y;
}
public String getY(){
  return this.y;
}
}

然后我用

创建了一个 ObjectMapper
private final static ObjectMapper mapper = new ObjectMapper();

并尝试这样读取值

ResponseData e = mapper.readValue(result.toString(), ResponseData.class);

并以异常结束

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "StatusCode" (class MyClass.ResponseData), not marked as ignorable (5 known properties: "x", "y", "siteId", "name", "type"])

好像它无法解析第一个条目,StatusMessage。即使我删除了第二个类并且只尝试解析前四个条目,其中我将 ResponseData 作为 String 返回,我仍然会遇到相同的异常。

最佳答案

首先,在 PL 中你应该有一个 List<ResponseData> 而不是一个简单的 ResponseData 属性。如您所见,在 JSON 中, ResponseData 是一个数组 "ResponseData":[...] 因此它将被反序列化为 List 。列表的每个元素都将是您定义的 ResponseData 对象。

然后你有一个大小写问题,你在 JSON 中有大写,而你的类属性中没有。您可以使用 @JsonProperty ( See API ) 注释来解决这个问题,方法如下:

class PL {
    @JsonProperty("StatusCode")
    private Long statusCode;
    @JsonProperty("ExecutionTime")
    private String executionTime;
    @JsonProperty("Message")
    private String message;
    @JsonProperty("ResponseData")
    private List<ResponseData> responseDatas;

    public PL(){
    }

    // getters/Setters  

}


class ResponseData {

    @JsonProperty("Name")
    private String name;
    @JsonProperty("SiteId")
    private String siteId;
    @JsonProperty("Type")
    private String type;
    @JsonProperty("X")
    private String x;
    @JsonProperty("Y")
    private String y;

    public ResponseData(){
    }

    // getters/Setters  

}

然后将您的 JSON 作为 PL 对象读取,如下所示:

ObjectMapper mapper = new ObjectMapper();
PL pl = mapper.readValue(json, PL.class);
for(ResponseData rd : pl.getResponseDatas()) {
    System.out.println(rd.getX());
    System.out.println(rd.getY());
}

这个输出:

1234567
123456
1234567
1234567
1234567
1234567
123456
123456

关于java - 使用 Jackson 在 Java 中序列化为 JSON 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386188/

相关文章:

java - Java Servlet 中的数字格式异常

java - apache openmeetings 与 JSP 的集成

JSON内容的HTTP Header该怎么填?

json - 如何使用 groovy GStringTemplateEngine 在 json 文件中创建数组字段

java - Jackson 序列化包括子类的字段

java - Jackson:在序列化时抑制 JsonTypeinfo?

java - 难以弄清楚java中split函数的工作原理

java - Spring Boot中update方法的实现

java - 需要 bean 的 JSONObject 构造函数不会映射父类(super class)中的属性

java - 从 spring mvc Controller 返回一个简单的映射结构到 ajax