如何在执行Jackson反序列化时将JSON字段名转换为与Java兼容的属性名?
我有一节课如何在执行Jackson反序列化时将JSON字段名转换为与Java兼容的属性名?,java,json,serialization,jackson,deserialization,Java,Json,Serialization,Jackson,Deserialization,我有一节课 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, Str
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 这个问题已经解决了,完全归功于和。一般来说,人们喜欢找到直接的答案,而不是真正喜欢浏览评论,尽管这些评论中可以给出实际的答案。因此,这个答案是专门为那些喜欢找到直接答案的用户提供的 如果使用Jackson将JSON转换为Java对象或从Java对象转换JSON,并且Jackson API版本低于1.8,那么如果JSON字段名和Java属性名不同,则需要使用@JsonProperty对getter和setter方法进行注释 因此,我用@JsonProperty注释了这两个setter方法。下面是修改后的代码(ServerDetails.java) 如果您想避免这种额外的工作,那么您需要升级您的jackson-alljar版本,并且版本应该高于1.7 为什么?为什么高于1.7? 用斯塔克斯曼的话来说 关键的区别是1.7和1.8:后者添加了代码来“统一”注释,所以不需要为getter和setter添加重命名。对于1.7,您需要为两者添加注释,而您的类只有一个注释。因此,从技术上讲,这不是一个bug(定义为行为),而是缺少功能
希望这个答案能帮助那些面临同样问题的人。这对我来说很好。请发一张MCVE。也就是说,更改您的示例,首先将对象序列化为
字符串
值,向我们显示字符串
值,然后直接反序列化它(不是在文件
中),并向我们显示结果(和代码)。对我来说也很好。您使用的是哪个版本的Jackson?升级到1.9.13或升级到Jackson 2。@Arin的关键区别是1.7和1.8:后者为“统一”注释添加了代码,因此不需要为getter和setter添加重命名。对于1.7,您需要为两者添加注释,而您的类只有一个注释。所以,从技术上讲,这不是一个bug(定义为行为),而是缺少功能。@StaxMan。对我已经在getter和setter上应用了@JsonProperty注释,并在VS1.7.6上对其进行了测试。它运行良好。感谢您指出实际的差异。
@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;
}