@JsonProperty annotation on field as well as getter/setter

后端 未结 2 944
鱼传尺愫
鱼传尺愫 2020-12-12 23:58

I have inherited a certain bit code that has the @JsonProperty annotation on getter/setters. The purpose is so that when the object is serialized using the Jackson library,

相关标签:
2条回答
  • 2020-12-13 00:10

    My observations based on a few tests has been that whichever name differs from the property name is one which takes effect:

    For eg. consider a slight modification of your case:

    @JsonProperty("fileName")
    private String fileName;
    
    @JsonProperty("fileName")
    public String getFileName()
    {
        return fileName;
    }
    
    @JsonProperty("fileName1")
    public void setFileName(String fileName)
    {
        this.fileName = fileName;
    }
    

    Both fileName field, and method getFileName, have the correct property name of fileName and setFileName has a different one fileName1, in this case Jackson will look for a fileName1 attribute in json at the point of deserialization and will create a attribute called fileName1 at the point of serialization.

    Now, coming to your case, where all the three @JsonProperty differ from the default propertyname of fileName, it would just pick one of them as the attribute(FILENAME), and had any on of the three differed, it would have thrown an exception:

    java.lang.IllegalStateException: Conflicting property name definitions
    
    0 讨论(0)
  • 2020-12-13 00:15

    In addition to existing good answers, note that Jackson 1.9 improved handling by adding "property unification", meaning that ALL annotations from difference parts of a logical property are combined, using (hopefully) intuitive precedence.

    In Jackson 1.8 and prior, only field and getter annotations were used when determining what and how to serialize (writing JSON); and only and setter annotations for deserialization (reading JSON). This sometimes required addition of "extra" annotations, like annotating both getter and setter.

    With Jackson 1.9 and above these extra annotations are NOT needed. It is still possible to add those; and if different names are used, one can create "split" properties (serializing using one name, deserializing using other): this is occasionally useful for sort of renaming.

    0 讨论(0)
提交回复
热议问题