2017-02-15 12 views
0

Я не понимаю, почему я получаю сериализованный JSON для данного класса, как показано ниже.Странная сериализация JSON с FasterXML Jackson

Это сгенерированный класс от WSDL, так что я не могу изменить его:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Lawyer") 
public class Lawyer extends Person { 

    @XmlElementWrapper(required = true) 
    @XmlElement(name = "lawyerOffice", namespace = "http://xxx/addressbook/external/v01/types") 
    protected List<LawyerOffice> lawyerOffices;  

    public List<LawyerOffice> getLawyerOffices() { 
    if (lawyerOffices == null) { 
     lawyerOffices = new ArrayList<LawyerOffice>(); 
    } 
    return lawyerOffices; 
    } 

    public void setLawyerOffices(List<LawyerOffice> lawyerOffices) { 
    this.lawyerOffices = lawyerOffices; 
    } 

} 

Когда экземпляр класса получает сериализовать fasterxml.jackson, я получаю:

{ 
    "ID": "e0d62504-4dfb-4c92-b70b-0d411e8ed102", 
    "lawyerOffice": [ 
     { 
      ... 
     } 
    ] 
} 

Так имя массив lawyerOffice. Я ожидаю lawyerOffice s.

Это осуществление, что я использую:

<dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.8.6</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
    </dependency> 

Это моя конфигурация ObjectMapper (вводится в CXF):

@Provider 
@Consumes({ MediaType.APPLICATION_JSON, "text/json" }) 
@Produces({ MediaType.APPLICATION_JSON, "text/json" }) 
public class JsonProvider extends JacksonJsonProvider { 

    public static ObjectMapper createMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 

    AnnotationIntrospector primary = new DPAJaxbAnnotationIntrospector(mapper.getTypeFactory()); 
    AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); 
    AnnotationIntrospector pair = AnnotationIntrospector.pair(primary, secondary); 
    mapper.setAnnotationIntrospector(pair); 
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    mapper.disable(SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED); 
    mapper.disable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 
    mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

    return mapper; 

    } 

    public JsonProvider() { 
    super(); 

    this.setMapper(createMapper()); 

    } 

} 

Как я могу получить "правильный" имя списка?

+0

Пожалуйста, оставьте комментарий, когда вы вниз голосование, так что я могу адаптировать этот вопрос. – mvermand

+1

'@XmlElement (name =" lawyerOffice "' ..., звучит для меня как «lawyerOffice» - это «правильное» имя. Тем не менее, учитывая ваш собственный ответ, вы действительно должны действительно включать исходный код конфигурации «ObjectMapper», потому что похоже, что ваша проблема вызвана тем, что вы явно используете поддержку аннотаций JAXB, что является довольно важной деталью, чтобы не учитывать ваш вопрос. –

ответ

1

Я нашел решение. Я включил опцию USE_WRAPPER_NAME_AS_PROPERTY_NAME функцию в конфигурации ObjectMapper:

ObjectMapper mapper = new ObjectMapper(); 
    AnnotationIntrospector primary = new JaxbAnnotationIntrospector(mapper.getTypeFactory()); 
    AnnotationIntrospector secondary = new JacksonAnnotationIntrospector(); 
    AnnotationIntrospector pair = AnnotationIntrospector.pair(primary, secondary); 
    mapper.setAnnotationIntrospector(pair); 
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    ... 
    mapper.enable(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME); // <----- 
    ... 

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

  • Нет связанных вопросов^_^