0

Jackson allows users to specify an explicit serialization order for ObjectNode properties using the @JsonProperty(index = ?) annotation. Meaning, given properties a, b, c I can instruct Jackson to serialize them in the following order: b, a, c. I control the exact serialization order.

Is it possible to achieve the same without the use of annotations?

I do not want alphabetic sorting. I want to specify an explicit sorting order.

Michał Ziober
  • 37,175
  • 18
  • 99
  • 146
Gili
  • 86,244
  • 97
  • 390
  • 689

1 Answers1

0

You can extend com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector class and provide your order for any class you want by overriding findSerializationPropertyOrder method.

import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.introspect.AnnotatedClass;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.json.JsonMapper;
import lombok.Data;

public class JacksonAnnotationIntrospectorApp {
    private final static JsonMapper JSON_MAPPER = JsonMapper.builder()
            .enable(SerializationFeature.INDENT_OUTPUT)
            .annotationIntrospector(new DynamicOrderJacksonAnnotationIntrospector())
            .build();

    public static void main(String[] args) throws Exception {
        var pojo = new DynamicOrderPojo();
        pojo.setA("A");
        pojo.setB(1);
        pojo.setC(3.33);

        JSON_MAPPER.writeValue(System.out, pojo);
    }
}

class DynamicOrderJacksonAnnotationIntrospector extends JacksonAnnotationIntrospector {

    @Override
    public String[] findSerializationPropertyOrder(AnnotatedClass ac) {
        if (ac.getRawType() == DynamicOrderPojo.class) {
            return new String[]{"b", "a", "c"};
        }
        return super.findSerializationPropertyOrder(ac);
    }
}

@Data
class DynamicOrderPojo {

    private String a;
    private Integer b;
    private Double c;
}

Above code prints:

{
  "b" : 1,
  "a" : "A",
  "c" : 3.33
}

See also:

Michał Ziober
  • 37,175
  • 18
  • 99
  • 146