How to map JSON field names to different object field names?

92,418

Solution 1

Probably it's a bit late but anyway..

you can rename a property just adding

@JsonProperty("contractor")

And by default Jackson use the getter and setter to serialize and deserialize.

For more detailed information: http://wiki.fasterxml.com/JacksonFAQ

Solution 2

With some example, You can also use it in getter and setter to rename it to different field

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;
    }

}

Solution 3

Please note that the proper JavaEE API for this is to use the javax.json.bind.annotation.JsonbProperty annotation. Of course Jackson and others are just some implementations of the JSON Binding API, they will likely comply with this.

Solution 4

If you are not using Jackson still want to rename a property you can use @SerializedName("your_original_key_name")

My JSON Data:

{
  "default": "0"
}

As you know we never use predefined keywords as a variable name so solution is:

@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;
    }

That's all you have to do now value comes from the key "default" and you can use it with getter and setter using "default_value"

In this case (Predifind Keywords as Json Key Name) or in any other case where you want to change your variable name to get data from the original key name this is the easiest approach.

Share:
92,418
Blessed Geek
Author by

Blessed Geek

מבורכים החנונים

Updated on March 02, 2021

Comments

  • Blessed Geek
    Blessed Geek about 3 years

    What is the equiv way in Jackson json annotation for the following jax-b annotations?

    I need to produce json rather than xml and need to know the conventional jackson annotations that is equivalently denoted in jax-b.

    1. rename a field.
    2. use getters instead of fields.

    These features are especially crucial if the json/xml element name is a java reserved word like "new", "public", "static", etc.

    So that we have to name the POJO fields as "_new_", "_public_", "_static_", etc, respectively,

    but use jax-b annotation to rename them back to "new", "public", "static", etc in the generated XML (and json) elements.

    Renaming a field

    @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_ ;
    }
    

    Redirect to using property getter (I think this is how it is done in 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_;}
    }
    
  • Nikolas
    Nikolas over 9 years
    Can I use this @JsonProperty annotation within class Person that already annotated with @XmlElement? I tried to override values of the properties like this: @JsonProperty(value = "json_Name") @XmlElement(name = "name_provider") public String getName() { return name; } but anyway my value of the name is name_provider, not json_Name
  • StaxMan
    StaxMan about 9 years
    Yes, although whether it works depends on precedence of `AnnotationIntrospector's included (Jackson's own vs JAXB). Both will be detected, but one registered with higher priority "wins".
  • stephen
    stephen about 8 years
    Thanks @StaxMan for the hint. I've used the coding found here to set the priority