Jackson dynamic property names

前端 未结 4 697
感动是毒
感动是毒 2020-11-27 16:46

I would like serialize an object such that one of the fields will be named differently based on the type of the field. For example:

public class Response {
          


        
4条回答
  •  孤街浪徒
    2020-11-27 17:19

    Using a custom JsonSerializer.

    public class Response {
      private String status;
      private String error;
    
      @JsonProperty("p")
      @JsonSerialize(using = CustomSerializer.class)
      private Object data;
    
      // ...
    }
    
    public class CustomSerializer extends JsonSerializer {
      public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        jgen.writeObjectField(value.getClass().getName(), value);
        jgen.writeEndObject();
      }
    }
    
    
    

    And then, suppose you want to serialize the following two objects:

    public static void main(String... args) throws Exception {
      ObjectMapper mapper = new ObjectMapper();
      Response r1 = new Response("Error", "Some error", 20);
      System.out.println(mapper.writeValueAsString(r1));
      Response r2 = new Response("Error", "Some error", "some string");
      System.out.println(mapper.writeValueAsString(r2));
    }
    

    The first one will print:

    {"status":"Error","error":"Some error","p":{"java.lang.Integer":20}}
    

    And the second one:

    {"status":"Error","error":"Some error","p":{"java.lang.String":"some string"}}
    

    I have used the name p for the wrapper object since it will merely serve as a placeholder. If you want to remove it, you'd have to write a custom serializer for the entire class, i.e., a JsonSerializer.

    提交回复
    热议问题