Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 树结构的Jackson序列化/反序列化_Java_Json_Jaxb_Jackson - Fatal编程技术网

Java 树结构的Jackson序列化/反序列化

Java 树结构的Jackson序列化/反序列化,java,json,jaxb,jackson,Java,Json,Jaxb,Jackson,我有以下POJO课程: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Folder", propOrder = { "id", "parent" }) @XmlSeeAlso({ FolderTree.class }) public class Folder { protected int id; protected int parent; getters, sette

我有以下POJO课程:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Folder", propOrder = {
    "id",
    "parent"   
})
@XmlSeeAlso({
    FolderTree.class
})
public class Folder
{    
    protected int id;
    protected int parent;

    getters, setters...
}

反序列化程序无法识别子文件夹对象(“子文件夹”:[])内的第二个字段子文件夹。是否有办法使其仅在父文件夹中包含子文件夹字段?或者怎样才能让Jackson反序列化这个对象呢

我无法更改POJO类,因为它们是由jaxb创建的,并且所有内容都可以正确使用XML。

解决方案

为了在没有子元素的情况下去掉空的子元素数组,我在序列化特性中禁用了WRITE_empty_JSON_数组。我使用Spring,bean如下所示:

<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
    <property name="annotationIntrospector" ref="jaxbAnnotationIntrospector" />
    <property name="featuresToDisable">
        <list>
            <value type="com.fasterxml.jackson.databind.SerializationFeature">WRITE_EMPTY_JSON_ARRAYS</value>
        </list>
    </property>
</bean>
最后,我扩展了ObjectMapper以设置MixinNotations:

public class CustomObjectMapper extends ObjectMapper
{
    public CustomObjectMapper()
    {
        super();
        customize();
    }

    protected void customize()
    {
        registerModule(new SimpleModule() {
            private static final long serialVersionUID = 1L;

            public void setupModule(SetupContext context) {
                super.setupModule(context);
                context.setMixInAnnotations(Folder.class, FolderMixin.class);
            }         
        });
    }
}
我为反序列化添加了两个注释导入器:

<bean id="customObjectMapper" class="path.to.my.CustomObjectMapper"> 
    <property name="annotationIntrospector" ref="introspectors" />
</bean> 

<!-- introspectors  -->
<bean id="xmlAnnotation" class="com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector">
    <constructor-arg value="#{customObjectMapper.getTypeFactory()}" />
</bean>

<bean id="jsonAnnotation" class="com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector" />

<bean id="introspectors" class="com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair">
    <constructor-arg ref="xmlAnnotation" />
    <constructor-arg ref="jsonAnnotation" />
</bean>
<!--  end of introspectors  -->

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="objectMapper" ref="customObjectMapper"/>
</bean> 

我使用Jackson 2.4.0

<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
    <property name="annotationIntrospector" ref="jaxbAnnotationIntrospector" />
    <property name="featuresToDisable">
        <list>
            <value type="com.fasterxml.jackson.databind.SerializationFeature">WRITE_EMPTY_JSON_ARRAYS</value>
        </list>
    </property>
</bean>
@JsonTypeInfo(  
        use = JsonTypeInfo.Id.NAME,  
        include = JsonTypeInfo.As.PROPERTY,  
        property = "folder",
        defaultImpl = FolderTree.class)
public class FolderMixin {

}
public class CustomObjectMapper extends ObjectMapper
{
    public CustomObjectMapper()
    {
        super();
        customize();
    }

    protected void customize()
    {
        registerModule(new SimpleModule() {
            private static final long serialVersionUID = 1L;

            public void setupModule(SetupContext context) {
                super.setupModule(context);
                context.setMixInAnnotations(Folder.class, FolderMixin.class);
            }         
        });
    }
}
<bean id="customObjectMapper" class="path.to.my.CustomObjectMapper"> 
    <property name="annotationIntrospector" ref="introspectors" />
</bean> 

<!-- introspectors  -->
<bean id="xmlAnnotation" class="com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector">
    <constructor-arg value="#{customObjectMapper.getTypeFactory()}" />
</bean>

<bean id="jsonAnnotation" class="com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector" />

<bean id="introspectors" class="com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair">
    <constructor-arg ref="xmlAnnotation" />
    <constructor-arg ref="jsonAnnotation" />
</bean>
<!--  end of introspectors  -->

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="objectMapper" ref="customObjectMapper"/>
</bean>