1

Let's say I'm making a call to an API that responds with the following JSON for a product:

{
  "success" : true,
  "message" : "ok",
  "product" : {
     "name : "food",
     "price" : 123
  }
}

I've tried converting it with simple RequestDTO.

public class RequestDTO {

   @JsonProperty("success")
   boolean success;

   @JsonProperty("message")
   boolean message;

   @JsonProperty("product.name")
   Stirng name;

   @JsonProperty("product.price")
   Long price;

}

But this doesn't work at spring boot project.

I want to map to product field without creating a Product class

How should I serialize and deserialize?

gisulee
  • 47
  • 4
  • I think this is what you are looking for - https://stackoverflow.com/questions/37010891/how-to-map-a-nested-value-to-a-property-using-jackson-annotations – Chandan May 29 '21 at 05:36
  • You want "ok" to deserialize to `boolean`? – adarsh May 29 '21 at 05:43

1 Answers1

0

Let's first edit RequestDTO:

@JsonSerialize(using = Serializer.class)
public class RequestDTO {
    @JsonProperty("success")
    boolean success;

    @JsonProperty("message")
    boolean message;

    String name;

    Long price;

    @JsonProperty("product")
    private void unpackNestedProduct(Map<String,Object> product) {
        this.name = (String)product.get("name");
        this.price = Long.valueOf((Integer)product.get("price"));
    }

    @JsonProperty("message")
    private void unpackMessage(String messageStr) {
        this.message = messageStr.equalsIgnoreCase("ok");
    }
}

And add a Serializer class:

public class Serializer extends StdSerializer<RequestDTO> {

    public Serializer() {
        this(null);
    }

    public Serializer(Class<RequestDTO> t) {
        super(t);
    }

    @Override
    public void serialize(RequestDTO value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeStartObject();
        jgen.writeBooleanField("success", value.success);
        jgen.writeStringField("message", value.message ? "ok" : "PutYourNotOKValueHere");

        jgen.writeFieldName("product");
            jgen.writeStartObject();
            jgen.writeStringField("name", value.name);
            jgen.writeNumberField("price", value.price);
            jgen.writeEndObject();

        jgen.writeEndObject();
    }
}

Then we can do:

String json = "{\"success\": true, \"message\": \"ok\", \"product\":{ \"name\": \"food\", \"price\": 123}}";
ObjectMapper objectMapper = new ObjectMapper();

RequestDTO requestDTO = objectMapper.readValue(json, RequestDTO.class);
System.out.println("To Java object: "+ requestDTO);
System.out.println("Back to JSON: "+ objectMapper.writeValueAsString(requestDTO));

Output:

To Java object: RequestDTO(success=true, message=true, name=food, price=123)
Back to JSON: {"success":true,"message":"ok","product":{"name":"food","price":123}}

You can read about more options here:

Most Noble Rabbit
  • 2,728
  • 2
  • 6
  • 12