【发布时间】:2011-08-01 22:12:05
【问题描述】:
我需要忽略 POJO 中的某些字段,因为它们被延迟加载和/或在某些情况下创建无限递归(父级一对多子级,子级多对一父级)。我的 POJO 位于另一个对 Jackson、JSON 等一无所知的 jar 中。
如何在不使用注释的情况下有效地告诉 Jackson 忽略这些字段?通过配置最好。
谢谢
【问题讨论】:
我需要忽略 POJO 中的某些字段,因为它们被延迟加载和/或在某些情况下创建无限递归(父级一对多子级,子级多对一父级)。我的 POJO 位于另一个对 Jackson、JSON 等一无所知的 jar 中。
如何在不使用注释的情况下有效地告诉 Jackson 忽略这些字段?通过配置最好。
谢谢
【问题讨论】:
您可以使用 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();
}
}
并向 Jackson 注册此自定义序列化程序:
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>
【讨论】:
除了建议的自定义处理程序(哪些会起作用),您还可以查看mix-in annotations(或this wiki page)。有了这些,您不仅可以使用@JsonIgnore,还可以使用@JsonManagedReference/@JsonBackReference,它们旨在保留一对一和一对多的关系(在序列化时忽略,但在反序列化时重新连接!)。
【讨论】: