How to serialize a List content to a flat JSON object with Jackson?

后端 未结 2 1486
离开以前
离开以前 2021-02-14 08:09

Given the following POJOs ..

public class City {

    private String title;
    private List people;
}

...

public         


        
2条回答
  •  天命终不由人
    2021-02-14 08:42

    Based on this link I suspect the field-level annotation only delegates writing the value not entire properties.

    A (rather kludgey) workaround might be to have a custom serializer for the entire City class:

    @JsonSerialize(using = CitySerializer.class)
    public class City {
        private String title;
        @JsonIgnore
        private List people;
    }
    

    ...and then

    public class CitySerializer extends JsonSerializer {
    
        private static final int START_INDEX = 1;
    
        @Override
        public void serialize(City city, 
                              JsonGenerator generator, 
                              SerializerProvider provider) throws IOException {
            generator.writeStartObject();
    
            // Write all properties (except ignored) 
            JavaType javaType = provider.constructType(City.class);
            BeanDescription beanDesc = provider.getConfig().introspect(javaType);
            JsonSerializer serializer = BeanSerializerFactory.instance.findBeanSerializer(provider,
                    javaType,
                    beanDesc);
            serializer.unwrappingSerializer(null).serialize(value, jgen, provider);`
    
            // Custom serialization of people
            List people = city.getPeople();
            for (int i = 0; i < people.size(); ++i) {
                Person person = people.get(i);
                int index = i + START_INDEX;
                serialize(person, index, generator);
            }
    
            generator.writeEndObject();
        }
    
        private void serialize(Person person, int index, JsonGenerator generator) throws IOException {
            generator.writeStringField(getIndexedFieldName("personName", index), 
                                       person.getName());
            generator.writeNumberField(getIndexedFieldName("personAge", index), 
                                       person.getAge());
        }
    
        private String getIndexedFieldName(String fieldName, int index) {
            return fieldName + "_" + index;
        }
    
    }
    
        

    提交回复
    热议问题