2017-01-31 2 views
0

Я пытаюсь получить правильный JSON для@XMLElementWrapper проблема с Codehaus JacksonJaxbJsonProvider

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

теперь я получаю

"data": [ 
    "Sidney" 
], 

вместо

"data":{ 
    "values": [ 
     "Sidney" 
    ] 
}, 

Я использую org.codehaus .jackson stack (1.9.0) внутри ServiceMix 7 M3.

Мой провайдер 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 но жгут оберните его?

+0

Вы можете либо обернуть его внутри данных, либо внутри значений. Оба не поддерживаются. –

+0

org.apache.cxf.jaxrs.provider.json.JSONProvider, например, визуализирует значения внутри элемента данных. Сначала мы использовали эту реализацию, но у нее есть проблема в том, что она не сериализует массив с одним элементом правильно. Вот почему мы переключили, но затем столкнулись с этой проблемой. Поэтому я не думаю, что ваш комментарий прав, верно? – mvermand

ответ

0

Как вы обнаружили, JSON-маршаллинг не почитает аннотации JAXB. Включите следующую MapperFeature на вашем Jackson ObjectMapper (ваш экземпляр с именем mapper).

mapper.enable(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME); 
+0

Согласно спецификации, настройка по умолчанию должна быть хорошей, и это так. Но это quickxml, и мы используем codehaus impl. Я мог бы использовать fastxml impl, но у меня возникла проблема неправильной сериализации массива с одним элементом. Если это можно решить, это тоже нормально для меня. – mvermand

+0

см. Мой родственный пост: http://stackoverflow.com/questions/41959368/xmlelementwrapper-issue-with-com-fasterxml-jackson-jacksonjaxbjsonprovider – mvermand

+0

Извините, я пропустил реализацию, которую вы используете. У более быстрого XML есть функция сериализации для того, разворачиваете ли вы один массив элементов. WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED (по умолчанию: false) Функция изменения обработки одноэлементных массивов, java.util.Collections, так что такие массивы/коллекции сериализуются как «развернутые» элементы, а не как массивы JSON. Вы пробовали это и все еще сталкиваетесь с проблемами? Ваша ссылка, похоже, указывает на тот же пост. –

Смежные вопросы