如何将JSON字段名称映射到不同的对象字段名称?

时间:2012-03-16 16:38:00

标签: java xml json annotations jackson

以下jax-b注释的Jackson json注释中的等价方式是什么?

我需要生成json而不是xml,并且需要知道在jax-b中等效表示的传统jackson注释。

  1. 重命名字段。
  2. 使用getter而不是字段。
  3. 如果json / xml元素名称是java保留字,则这些功能尤其重要 例如“new”,“public”,“static”等。

    因此我们必须将POJO字段分别命名为“_new_”,“_ public _”,“_ static_”等,

    但是使用jax-b注释将它们重命名为“new”,“public”,“static”等 在生成的XML(和json)元素中。

    重命名字段

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Person{
        @XmlElement(required = true)
        protected String name;
        @XmlElement(required = true)
        protected String address;
        @XmlElement(name = "contractor")
        protected boolean _restricted_ ;
        @XmlElement(name = "new")
        protected boolean _new_ ;
    }
    

    重定向到使用属性getter (我认为这是在jax-b中完成的方式)

    @XmlAccessorType(XmlAccessType.PROPERTY)
    public class Person{
        protected String name;
        protected String address;
        protected boolean _restricted_ ;
        protected boolean _new_ ;
    
        @XmlElement(required = true)
        protected String getName() {return name;}
        @XmlElement(required = true)
        protected String getAddress() {return address;}
        @XmlElement(name = "contractor")
        protected boolean getRestricted() {return _restricted_;}
        @XmlElement(name = "new")
        protected boolean getNew(){return _new_;}
    }
    

4 个答案:

答案 0 :(得分:80)

可能有点晚了但无论如何..

您只需添加

即可重命名该属性
@JsonProperty("contractor")

默认情况下,Jackson使用getter和setter来序列化和反序列化。

有关详细信息:http://wiki.fasterxml.com/JacksonFAQ

答案 1 :(得分:1)

通过一些示例,您还可以在其中使用getter和setter将其重命名为其他字段

public class Sample {

    private String fruit;

    @JsonProperty("get_apple")
    public void setFruit(String fruit) {
        this.fruit = fruit;
    }

    @JsonProperty("send_apple")
    public String getFruit() {
        return fruit;
    }

}

答案 2 :(得分:1)

请注意,正确的JavaEE API为此应使用javax.json.bind.annotation.JsonbProperty批注。当然,Jackson和其他人只是JSON Binding API的部分实现,他们很可能会遵守此规范。

答案 3 :(得分:0)

如果您不使用 Jackson 仍想重命名属性,您可以使用 @SerializedName("your_original_key_name")

我的 JSON 数据:

{
  "default": "0"
}

如您所知,我们从不使用预定义的关键字作为变量名,因此解决方案是:

@SerializedName("default")
private String default_value;

public String getDefault_value() {
        return default_value;
    }
public void setDefault_value(String default_value) {
        this.default_value = default_value;
    }

这就是您现在要做的所有事情,值来自键“default”,您可以使用“default_value”将它与 getter 和 setter 一起使用

在这种情况下(Predifind 关键字作为 Json 键名)或任何其他您想要更改变量名称以从原始键名获取数据的情况,这是最简单的方法。