在进行杰克逊反序列化时,如何将JSON字段名称转换为Java兼容的属性名称?

细菌

我有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.jarjdk1.8.0_31

细菌

这个问题已经解决,sotirios-delimanolisstaxman得到了赞誉。尽管人们可以在这些评论中找到实际答案,但人们通常喜欢找到直接的答案,而不是真正喜欢通过评论。因此,此答案专用于喜欢查找直接答案的那些类型的用户。

如果您正在使用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.7和1.8:后者添加了代码以“统一”注释,因此您无需为getter和setter都添加重命名。使用1.7,您将需要为两者都添加注释,并且您的类仅将它们用于一个注释。因此,从技术上讲不是错误(这是定义的行为),而是缺少功能。

希望这个答案对遇到同样问题的人有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

杰克逊通过字段名称自定义序列化程序?

来自分类Dev

我如何使用杰克逊将“名称”“值”对的JSON数组反序列化为Pojo

来自分类Dev

杰克逊仅使用字段名称对响应进行排序

来自分类Dev

如何使用Play的JSON序列化/反序列化动态字段名称

来自分类Dev

杰克逊反序列化XML名称相同的字段

来自分类Dev

使用动态字段名称将JSON反序列化为C#类

来自分类Dev

杰克逊:父类的属性被忽略:将json反序列化为数据

来自分类Dev

杰克逊将字段序列化为其他名称

来自分类Dev

进行建模以匹配此JSON以进行反序列化,字段名称带有破折号

来自分类Dev

杰克逊:如何使用简写属性值反序列化json

来自分类Dev

使用杰克逊将JSON反序列化为Java-特殊字符问题

来自分类Dev

杰克逊不会自动将字段的复杂名称从json-object转换为dto-object

来自分类Dev

杰克逊将Java合成序列化为JSON

来自分类Dev

Boon JSON-更改对象反序列化的字段名称

来自分类Dev

JSON中的字段名称“ Parts”会导致反序列化失败

来自分类Dev

Boon JSON-更改对象反序列化的字段名称

来自分类Dev

使用带有动态字段名称的 jackson 反序列化 json

来自分类Dev

杰克逊/ GSON序列化和反序列化的JavaFX属性以JSON

来自分类Dev

杰克逊将多余的字段反序列化为地图

来自分类Dev

杰克逊:如何将平面 json 转换为嵌套 json

来自分类Dev

如何在自定义json序列化程序中获取属性或字段名称

来自分类Dev

将空值进行杰克逊反序列化为长数据类型

来自分类Dev

杰克逊 将缺少的属性反序列化为空可选

来自分类Dev

杰克逊将数组反序列化为Java对象

来自分类Dev

Logstash 将字段名称转换为全部小写

来自分类Dev

如何在 Java 中预处理 Json 字符串 :: 将大写的字段名称转换为小写的驼峰式名称

来自分类Dev

杰克逊JSON如何从对象数组反序列化日期

来自分类Dev

如何命名c#类字段以能够反序列化具有无效字符的json字段名称

来自分类Dev

将字段名称和值的映射反序列化为基于KClass的数据类(反射)

Related 相关文章

  1. 1

    杰克逊通过字段名称自定义序列化程序?

  2. 2

    我如何使用杰克逊将“名称”“值”对的JSON数组反序列化为Pojo

  3. 3

    杰克逊仅使用字段名称对响应进行排序

  4. 4

    如何使用Play的JSON序列化/反序列化动态字段名称

  5. 5

    杰克逊反序列化XML名称相同的字段

  6. 6

    使用动态字段名称将JSON反序列化为C#类

  7. 7

    杰克逊:父类的属性被忽略:将json反序列化为数据

  8. 8

    杰克逊将字段序列化为其他名称

  9. 9

    进行建模以匹配此JSON以进行反序列化,字段名称带有破折号

  10. 10

    杰克逊:如何使用简写属性值反序列化json

  11. 11

    使用杰克逊将JSON反序列化为Java-特殊字符问题

  12. 12

    杰克逊不会自动将字段的复杂名称从json-object转换为dto-object

  13. 13

    杰克逊将Java合成序列化为JSON

  14. 14

    Boon JSON-更改对象反序列化的字段名称

  15. 15

    JSON中的字段名称“ Parts”会导致反序列化失败

  16. 16

    Boon JSON-更改对象反序列化的字段名称

  17. 17

    使用带有动态字段名称的 jackson 反序列化 json

  18. 18

    杰克逊/ GSON序列化和反序列化的JavaFX属性以JSON

  19. 19

    杰克逊将多余的字段反序列化为地图

  20. 20

    杰克逊:如何将平面 json 转换为嵌套 json

  21. 21

    如何在自定义json序列化程序中获取属性或字段名称

  22. 22

    将空值进行杰克逊反序列化为长数据类型

  23. 23

    杰克逊 将缺少的属性反序列化为空可选

  24. 24

    杰克逊将数组反序列化为Java对象

  25. 25

    Logstash 将字段名称转换为全部小写

  26. 26

    如何在 Java 中预处理 Json 字符串 :: 将大写的字段名称转换为小写的驼峰式名称

  27. 27

    杰克逊JSON如何从对象数组反序列化日期

  28. 28

    如何命名c#类字段以能够反序列化具有无效字符的json字段名称

  29. 29

    将字段名称和值的映射反序列化为基于KClass的数据类(反射)

热门标签

归档