Search code examples
javajsonjacksonjson-deserialization

Json deserialization Java


i have a simple question, let's say I have this json

{
   "outer-field":{
      "outer-a":"something",
      "outer-b":12345678,
      "inner-field":{
         "inner-a":false,
         "inner-b":0.0,
         "inner-c":29.99
      }
   }
}

Mapped this way:


public class OuterObject {

    @JsonProperty("outer-a")
    public String outerA;
   
    @JsonProperty("outer-b")
    public Integer outerB;
   
    @JsonProperty("inner-field")
    public InnerObject innerField;

}

public class InnerObject{

    @JsonProperty("inner-a")
    public Boolean innerA;

    @JsonProperty("inner-b")
    public Double innerB;

    @JsonProperty("inner-c")
    public Double innerC;

I was wondering if it was possible to just save an outer field in the inner object like this by using some custom setter/annotation or something:


public class InnerObject{

    @JsonProperty("inner-a")
    public Boolean innerA;

    @JsonProperty("inner-b")
    public Double innerB;

    @JsonProperty("inner-c")
    public Double innerC;

    //how to map this?
    @JsonProperty("outer-a")
    public String outerA;

PS: using a custom deserialization is my last resort due to the complexity of the json


Solution

  • If anyone was asking how I solve my problem, I decided to use a custom Builder by using the withXXX methods inside to pass the outer attributes to the inner object during creation

    @Jacksonized
    @JsonDeserialize(builder = OuterObject.Builder.class)
    @AllArgsConstructor
    @Data
    public class OuterObject {
    
        public String outerA;
        public Integer outerB;
        public InnerObject innerObject;
    
        public static class Builder {
    
            public String outerA;
            public Integer outerB;
            public InnerObject innerObject;
    
            Builder withInnerObject(InnerObject innerObject) {
                // set attributes here
                innerObject.outerA = this.outerA
                this.innerObject = innerObject
                return this;
            }
    
            public OuterObject build() {
                return new(outerA, outerB, innerObject)
            }
    
    Hope someone might find this helpful