Java @codehaus JacksonJaxbJsonProvider的XMLElementWrapper问题

Java @codehaus JacksonJaxbJsonProvider的XMLElementWrapper问题,java,json,serialization,jaxb,jackson,Java,Json,Serialization,Jaxb,Jackson,我正在尝试为获取正确的JSON public class MyTestResponse { @XmlElementWrapper(name = "data") @XmlElement(name = "values") public List<String> test = Arrays.asList("Sidney"); } 而不是 "data":{ "values": [ "Sidney" ] }, 我在ServiceMix

我正在尝试为获取正确的JSON

public class MyTestResponse {
    @XmlElementWrapper(name = "data")
    @XmlElement(name = "values")
    public List<String> test = Arrays.asList("Sidney");
}
而不是

"data":{
    "values": [
        "Sidney"
    ]
},
我在ServiceMix 7 M3中使用org.codehaus.jackson堆栈(1.9.0)

我的JSON提供程序扩展了org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider:

import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;


public class MyJsonProvider extends JacksonJaxbJsonProvider {

    public JsonProvider() {
        super();
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
        AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(secondary, primary);
        mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
        mapper.getSerializationConfig().setAnnotationIntrospector(pair);
        this.setMapper(mapper);
    }

}

我如何告诉JacksonJaxbJsonProvider不要替换XmlElement名称,而是将其包装起来?

正如您所发现的,JSON编组不支持JAXB注释。在jackson ObjectMapper(名为mapper的实例)上启用以下MapperFeature


您可以将其包装在数据内或值内。两者都不受支持。例如,org.apache.cxf.jaxrs.provider.json.JSONProvider会在数据元素中呈现值。我们首先使用了该实现,但它有一个问题,即它没有用单个元素序列化数组。这就是为什么我们切换了,但后来遇到了这个问题。所以我不认为你的评论是对的,对吗?根据规范,默认设置应该是好的,而且是。但这是fasterxml,我们使用的是codehaus impl。我可以使用FasterXMLImpl,但它存在一个问题,即不能用单个元素正确序列化数组。如果能解决这个问题,我也没问题。请看我的相关帖子:对不起,我忽略了你正在使用的实现。对于是否展开单个元素数组,更快的XML确实具有序列化功能。编写_SINGLE_ELEM_ARRAYS _UNWRAPPED(默认值:false)功能更改对单元素数组java.util.Collections的处理,以便将这些数组/集合序列化为“UNWRAPPED”元素,而不是JSON数组。您是否尝试过,但仍然遇到问题?您的链接似乎指向同一篇文章。另一个链接确实指向了另一个问题,关于fasterxml的处理,我尝试添加WRITE_SINGLE_ELEM_array_UNWRAPPED,但没有成功。请澄清,您希望序列化程序在“BadgerFish”之后编写单元素数组wrapped{“arrayProperty”:[1]}还是UNWRAPPED约定,{“阵列属性”:1}。在另一篇文章中,您同时启用了这两个选项,因此我假设是后者。
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.AnnotationIntrospector;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;


public class MyJsonProvider extends JacksonJaxbJsonProvider {

    public JsonProvider() {
        super();
        ObjectMapper mapper = new ObjectMapper();
        AnnotationIntrospector primary = new JaxbAnnotationIntrospector();
        AnnotationIntrospector secondary = new JacksonAnnotationIntrospector();
        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(secondary, primary);
        mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
        mapper.getSerializationConfig().setAnnotationIntrospector(pair);
        this.setMapper(mapper);
    }

}
mapper.enable(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME);