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

Java 如何将JSON字段名映射到不同的对象字段名?,java,xml,json,annotations,jackson,Java,Xml,Json,Annotations,Jackson,对于以下jax-b注释,Jackson json注释中的等价方式是什么 我需要生成json而不是xml,并且需要了解jax-b中等价表示的传统jackson注释 重命名字段 使用getter而不是字段 如果json/xml元素名是java保留字,则这些特性尤其重要 如“新建””、“公共””、“静态””等 因此,我们必须将POJO字段分别命名为“_new_uu”,“_public_uuu”,“_static_uu”,等等 但是使用jax-b注释将它们重新命名为“new”、“public”、“sta

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

我需要生成json而不是xml,并且需要了解jax-b中等价表示的传统jackson注释

  • 重命名字段
  • 使用getter而不是字段
  • 如果json/xml元素名是java保留字,则这些特性尤其重要 如“
    新建”
    ”、“
    公共”
    ”、“
    静态”
    ”等

    因此,我们必须将POJO字段分别命名为“_new_uu”,“_public_uuu”,“_static_uu”,等等

    但是使用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中就是这样做的)


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

    只需添加属性,即可重命名属性

    @JsonProperty("contractor")
    
    默认情况下,Jackson使用getter和setter来序列化和反序列化


    有关更多详细信息:

    举个例子,还可以在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;
        }
    
    }
    

    请注意,正确的JavaEEAPI是使用
    javax.json.bind.annotation.JsonbProperty
    注释。当然,Jackson和其他人只是JSON绑定API的一些实现,他们可能会遵守这一点。

    如果您不使用Jackson,仍然希望重命名属性,您可以使用@SerializedName(“您的原始密钥名称”)

    我的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\u值”将其与getter和setter一起使用


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

    是否
    @xmlement(Name=“new”)
    不适合您?我刚刚在Jersey servlet(使用Jackson)上试用过,效果很好。我正在使用RestyGWT-我认为该功能在RestyGWT中找不到,因此在尝试/提议提交补丁之前,我需要知道Jackson等价物。感谢@BlessedGeek的提示。更多信息可以在上找到,尽管链接中的方法有点旧,但我正在使用此代码设置序列化器/反序列化器的优先级。setAnnotationIntrospector(新的AnnotationIntrospector对(新的JacksonAnnotationIntrospector(),新的JaxbAnnotationIntrospector());我可以在已经用@XmlElement注释的类Person中使用这个@JsonProperty注释吗?我试图重写如下属性的值:
    @JsonProperty(value=“json_Name”)@xmlement(Name=“Name_provider”)公共字符串getName(){return Name;}
    ,但无论如何,我的名称值是Name_provider,而不是json_NameYes,尽管它是否有效取决于所包含的“AnnotationIntrosector”的优先级(Jackson自己的vs JAXB)。两者都将被检测到,但其中一个以更高优先级“wins”注册。感谢@StaxMan的提示。我用找到的编码设置优先级
    @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;
        }