大家早上好!
我有一个 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"}
]
}
我想创建一个对象,我可以在其中检索 X
和 Y
值。
我一直在尝试使用 Jackson 来序列化 JSON 字符串,但没有成功。我创建了两个额外的类供 Jackson 使用。顶层的一个类,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
关于java - 使用 Jackson 在 Java 中序列化为 JSON 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386188/