【问题标题】:MappingJacksonJsonView: ignore fields without using @JsonIgnoreMappingJacksonJsonView:忽略字段而不使用@JsonIgnore
【发布时间】:2011-08-01 22:12:05
【问题描述】:

我需要忽略 POJO 中的某些字段,因为它们被延迟加载和/或在某些情况下创建无限递归(父级一对多子级,子级多对一父级)。我的 POJO 位于另一个对 Jackson、JSON 等一无所知的 jar 中。

如何在不使用注释的情况下有效地告诉 Jackson 忽略这些字段?通过配置最好。

谢谢

【问题讨论】:

    标签: java spring jackson


    【解决方案1】:

    您可以使用 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>
    

    【讨论】:

      【解决方案2】:

      除了建议的自定义处理程序(哪些会起作用),您还可以查看mix-in annotations(或this wiki page)。有了这些,您不仅可以使用@JsonIgnore,还可以使用@JsonManagedReference/@JsonBackReference,它们旨在保留一对一和一对多的关系(在序列化时忽略,但在反序列化时重新连接!)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 2015-07-15
        • 2015-12-05
        相关资源
        最近更新 更多