我需要忽略POJO中的某些字段,因为它们是延迟加载的和/或在某些情况下创建无限递归(父对齐的一对多Childs,Child多对一父对象)。我的POJO驻留在另一个对Jackson,JSON等一无所知的罐子里。
如何在不使用注释的情况下有效地告诉杰克逊忽略这些字段?通过配置将是最好的。
由于
答案 0 :(得分:6)
您可以使用Java代码编写自定义序列化程序和解串行程序:
class CustomSerializer extends JsonSerializer<ARow> {
@Override
public Class<ARow> handledType() {
return ARow.class;
}
public void serialize(ARow value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeStringField("ounc", value.ounces.toLowerCase()); //Do this for all of your relevant properties..
jgen.writeEndObject();
}
}
并向杰克逊注册此自定义序列化器:
ObjectMapper m = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
testModule.addSerializer(new CustomSerializer());
m.registerModule(testModule);
要使用Spring MappingJacksonJsonView
进行设置,您需要扩展自己的ObjectMapper
public class MyCustomObjectMapper extends ObjectMapper {
public MyCustomObjectMapper() {
SimpleModule module = new SimpleModule("My Module", new Version(1, 0, 0, "SNAPSHOT"));
module.addSerializer(new CustomSerializer());
module.addSerializer(new CustomSerializer2());
// etc
this.registerModule(module);
}
}
为它创建一个bean
<bean id="myCustomObjectMapper" class="com.foo.proj.objectmapper.MyCustomObjectMapper"/>
并将其注入MappingJacksonJsonView
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="objectMapper" ref="myCustomObjectMapper"/>
</bean>
答案 1 :(得分:3)
除了建议的自定义处理程序(以及可行的自定义处理程序)之外,您还可以查看mix-in annotations(或this wiki page)。有了这些,您不仅可以使用@JsonIgnore,还可以使用@JsonManagedReference / @JsonBackReference,它们旨在保留一对一和一对多关系(在序列化时忽略,但在反序列化时重新连接!)。