如何将JACKSON序列化程序用于用于不同服务的域对象?

时间:2012-09-27 08:05:24

标签: java json jackson

我有一个域对象,用于以下两种不同的服务:

public class PersonDetails {

    private String personId;    
    private String personMaritalStatus;
    private String personFirstName;
    private String personLastName;

    // setters and getters ...
}

并提供两种不同的服务。

第一个:

public BaseResponse getClient(@QueryParam("id") @DefaultValue("-1") String id) 
{
}

此服务应返回json,如下所示:

{ "personId":12, 
  "personMaritalStatus":"married", 
  "personFirstname" :"abc", 
  "personLastname":"pqr" }

第二项服务:

public BaseResponse getClientName(@QueryParam("id") @DefaultValue("-1") String id) 
{    
}

此服务应返回json,如下所示:

{"personFirstname" :"abc"}

因此,如果我使用@JsonSerialize(using=PersonDetailsSerializer.class)而不是域对象,则序列化程序类将如下所示:

public class PersonDetailsSerializerextends JsonSerializer<PersonDetails> 
{
    @Override
    public void serialize(PersonDetails personDetails,
                          JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) 
                              throws IOException, JsonProcessingException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("personFirstname", personDetails.getpersonFirstName());
        jsonGenerator.writeEndObject(); 
    } 
}

然后它也会影响getPerson服务的响应。

那么我如何使用服务级别序列化或使用JACKSON来处理这个...

1 个答案:

答案 0 :(得分:0)

您可以使用两个不同的ObjectMappers,一个使用MixIn,另一个不使用。

abstract class PersonNameMixIn {
    @JsonIgnore()
    abstract String getPersonLastName();
    @JsonIgnore()
    abstract String getPersonMaritalStatus();
}

public getClientName() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.getSerializationConfig().addMixInAnnotations(PersonDetails.class, PersonNameMixIn.class);
        mapper.writeValue(writer, person);        
}

public getClient() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(writer, person);        
}