使用mixin和更改的getter进行JAVA对象映射器序列化

时间:2016-07-13 09:35:40

标签: java json jackson

我使用 Jackson Object Mapper MixIn 类将对象(无法访问的代码)映射到json中。所以,例如我有这个对象:

public class Person {
   private String name;
   private String surname;

   public Person (String name, String surname) {
       this.name = name;
       this.surname = surname;
   }

   public String getName() {
       return name;
   }

   public String getSurname() {
       return surname;
   }
}
像这样的

和MixIn类:

abstract class MixIn {
   @JsonIgnore
   abstract String getSurname(); // we don't need this in json output!
}

这很好用。但是,如果我需要将"getName()" getter的输出更改为return person.name + " " + person.surname返回,该怎么办?

这是否可以通过特定的Object Mapper配置来实现?(当我对代码无权访问时)

3 个答案:

答案 0 :(得分:1)

您可以编写自定义序列化程序:

class PersonSerializer extends JsonSerializer<Person> {
    @Override
    public void serialize(Person person, JsonGenerator generator, SerializerProvider provider) throws IOException {
        generator.writeStartObject();
        generator.writeStringField("name", person.getName() + " " + person.getSurname());
        generator.writeEndObject();
    }
}

然后,有多种方法可以注册它,例如使用模块:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Person.class, new PersonSerializer());
mapper.registerModule(module);

System.out.println(mapper.writeValueAsString(new Person("user", "1827257")));

答案 1 :(得分:1)

您可能希望在不同情况下以不同方式序列化对象,因此首选使用mixins:

objectMapper.getSerializationConfig().addMixInAnnotations(Person.class, MixIn.class);
String json = objectMapper.writeValueAsString(new Person("user", "1827257"));

答案 2 :(得分:-1)

您可以使用https://github.com/google/gson/代替当前的JSON库。 它允许您非常容易地序列化对象:

String json = new Gson().toJson(yourObjectInstance);

https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/Gson.java#L579