使用Jackson在Java中使用JSON序列化时遇到问题
早上好家伙!
我有一个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); 并最终得到例外
好像它无法解析第一个条目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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |