Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在执行Jackson反序列化时将JSON字段名转换为与Java兼容的属性名?_Java_Json_Serialization_Jackson_Deserialization - Fatal编程技术网

如何在执行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.jarjdk1.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;
}