加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用Jackson在Java中使用JSON序列化时遇到问题

发布时间:2020-12-15 08:26:10 所属栏目:Java 来源:网络整理
导读:早上好家伙! 我有一个JSON字符串,看起来像: { "StatusCode":0,"Message":null,"ExecutionTime":0,"ResponseData":[ {"Name":"name1","SiteId":"1234","Type":"Type1","X":"1234567","Y":"123456"},{"Name":"Name2","SiteId":"2134","Type":"Type2","Y":"12
早上好家伙!

我有一个JSON字符串,看起来像:

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

我想创建一个可以检索X和Y值的对象.

我一直在尝试使用Jackson序列化JSON字符串,但没有成功.我为杰克逊创建了两个额外的课程.顶层的一个类,StatusCode,Message,ExecutionTime和ResponseData看起来像

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读