序列化为JSON时变平pojo属性?

时间:2019-05-24 13:16:23

标签: java json serialization jackson pojo

想象一下,我有两个这样的课程。

class person{
    String name;
    Int age;
    Address address;
}

class Address{
    String city;
    String country;
}

当一个Person对象被序列化时,我想这样看。即展平地址字段。

{
    name: "John",
    age: 25,
    city: "London",
    country: "United Kingdom"
}

是否有任何注释(杰克逊)或其他解决方法可以实现我的目标?

1 个答案:

答案 0 :(得分:3)

(1)基于Jackson的快速解决方案是@JsonUnwrapped批注。但是请注意,它具有here中所述的某些限制。

@JsonAutoDetect(fieldVisibility=Visibility.ANY)
class Person {

    String name;
    Int age;

    @JsonUnwrapped
    Address address;

}

(2)第二种方法是对Person类使用自定义序列化程序(使用Jackson)。与(1)相比,更加灵活和可自定义:

@JsonSerialize(using = PersonSerializer.class)
class Person {
    ...
}

public class PersonSerializer extends StdSerializer<Person> {

    @Override
    public void serialize(Person person, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {

        jgen.writeStartObject();
        jgen.writeStringField("name", person.getName());
        jgen.writeNumberField("age", person.getAge());
        jgen.writeStringField("city", person.getAddress().getCity());
        jgen.writeStringField("country", person.getAddress().getCountry());
        jgen.writeEndObject();
    }
}

(3)其他解决方案可能基于gson,但也可以使用自定义适配器:

@JsonAdapter(PersonAdapter.class)
class Person {
    ...
}

public class PersonAdapter extends TypeAdapter<Person> {
    ...
}