我有ServerDetails pojo类。
package org.vo;
import org.codehaus.jackson.annotate.JsonProperty;
public class ServerDetails {
private Integer serverId;
private String server_url;
public ServerDetails() {
}
public ServerDetails(Integer serverId, String server_url) {
this.serverId = serverId;
this.server_url = server_url;
}
@JsonProperty("server-id")
public Integer getServerId() {
return serverId;
}
public void setServerId(Integer serverId) {
this.serverId = serverId;
}
@JsonProperty("server-url")
public String getServer_url() {
return server_url;
}
public void setServer_url(String server_url) {
this.server_url = server_url;
}
}
我使用Jackson API将ServerDetails对象转换为JSON,并使用@JsonProperty注释来自定义JSON字段名称。所以我生成的JSON像预期的那样
{
"server-id":1,
"server-url":"http://stackoverflow.com"
}
虽然在pojo类中,属性是serverId和server_url,但是在生成的JSON中,字段是server-id和server-url,因为我在两个属性的getter方法上都应用了@JsonProperty批注。
现在一切都还好。
但是,当我尝试将相同的JSON转换为Java时,出现错误提示
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "server-id" (Class org.vo.ServerDetails), not marked as ignorable
at [Source: D:\tmp\ServerDetails.json; line: 1, column: 15] (through reference chain: org.vo.ServerDetails["server-id"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:244)
at org.codehaus.jackson.map.deser.StdDeserializer.reportUnknownProperty(StdDeserializer.java:605)
at org.codehaus.jackson.map.deser.StdDeserializer.handleUnknownProperty(StdDeserializer.java:591)
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:684)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:515)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:351)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2130)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1348)
at org.converter.JSONToJavaExample.main(JSONToJavaExample.java:16)
我不知何故无法解决该问题,我只想从生成的JSON中获取ServerDetails对象。
以下是我的JSON到Java对象转换的代码。
import java.io.File;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.vo.ServerDetails;
public class JSONToJavaExample {
public static void main(String[] args) {
ServerDetails serverDetails = null;
ObjectMapper mapper = new ObjectMapper();
try {
serverDetails = mapper.readValue(new File(
"D:/tmp/ServerDetails.json"), ServerDetails.class);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我正在使用jackson-all-1.7.6.jar和jdk1.8.0_31。
这个问题已经解决,sotirios-delimanolis和staxman都得到了赞誉。尽管人们可以在这些评论中找到实际答案,但人们通常喜欢找到直接的答案,而不是真正喜欢通过评论。因此,此答案专用于喜欢查找直接答案的那些类型的用户。
如果您正在使用Jackson将JSON与Java对象之间进行转换,并且Jackson API版本低于1.8,则如果JSON字段名称和Java属性名称不同,则需要使用@JsonProperty注释getter和setter方法。
因此,我已经用@JsonProperty批注对这两个setter方法进行了批注。下面是修改后的代码(ServerDetails.java)
@JsonProperty("server-id")
public Integer getServerId() {
return serverId;
}
// added
@JsonProperty("server-id")
public void setServerId(Integer serverId) {
this.serverId = serverId;
}
@JsonProperty("server-url")
public String getServer_url() {
return server_url;
}
// added
@JsonProperty("server-url")
public void setServer_url(String server_url) {
this.server_url = server_url;
}
如果要避免这种额外的工作,则需要升级您的杰克逊所有jar版本,并且该版本应高于1.7。
用萨克斯曼的话
关键区别在于1.7和1.8:后者添加了代码以“统一”注释,因此您无需为getter和setter都添加重命名。使用1.7,您将需要为两者都添加注释,并且您的类仅将它们用于一个注释。因此,从技术上讲不是错误(这是定义的行为),而是缺少功能。
希望这个答案对遇到同样问题的人有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句