Json 当列表只有一个元素时,CXF将返回对象,而不是js数组

Json 当列表只有一个元素时,CXF将返回对象,而不是js数组,json,web-services,cxf,Json,Web Services,Cxf,我正在使用CXF创建restful服务。其中一个服务返回字符串列表。当列表中有多个项目时,CXF将返回字符串数组,但当我只有一个元素时,它将返回字符串,而不是带有json的数组: 其中一项: {"ImageResponse":{"images":"hello"}} 其中包括两项: {"ImageResponse":{"images":["hello","hi"]}} 是否有一种方法可以始终返回列表,即使列表只有一项 我的回应课: @XmlRootElement public class

我正在使用CXF创建restful服务。其中一个服务返回字符串列表。当列表中有多个项目时,CXF将返回字符串数组,但当我只有一个元素时,它将返回字符串,而不是带有json的数组:

其中一项:

 {"ImageResponse":{"images":"hello"}}
其中包括两项:

 {"ImageResponse":{"images":["hello","hi"]}}
是否有一种方法可以始终返回列表,即使列表只有一项

我的回应课:

@XmlRootElement
public class ImageResponse {
private List<String> images;
//getter and setter
}
@XmlRootElement
公共类图像响应{
私有列表图像;
//接二连三
}

在cxf json提供程序上尝试将“serializeAsArray”设置为true。请参阅:

您的第一个JSON不包含包含一项的列表

如果希望图像成为数组,则必须使用方括号

{“ImageResponse”:{“images”:[“hello”]}


当您使用抛弃进行JSON序列化时,就会出现上述问题。抛弃是CXF中的默认设置。实现需求的最简单方法是将JSON提供程序更改为Jackson。在这里,您不必设置
serializeAsArray
,也不必为每个带有列表的字段提及
arrayKeys

将以下内容添加到bean定义中:

<jaxrs:providers>
    <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
</jaxrs:providers>

然后,添加包含Jackson库的文件。maven pom依赖项如下所示:

<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-jaxrs</artifactId>
  <version>1.9.0</version>
</dependency>

org.codehaus.jackson
添加以下依赖项

   <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-jaxrs</artifactId>
    <version>1.9.0</version>
    </dependency>
现在使用这个字符串而不是对象(使用CXF将这个字符串对象转换为JSON(就像当前处理对象的方式一样))


也有类似的情况。cxf不返回js端请求的数组,它额外添加了一些“item”标记。必须在applicationContext.xml中进行更改,添加jsonProvider并在jaxrs中引用它

<jaxrs:server id="someid" address="/">
    <jaxrs:providers>
        <ref bean="jsonProvider" />      
    </jaxrs:providers> 

<bean id="jsonProvider"  lass="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
          <property name="mapper" ref="jsonMapper" /> </bean>   
<bean id="jsonMapper" class="com.bofa.idp.disclosures.CustomJsonMapper" /> 
可以将单个服务调整为不使用CustomeJsonMapper中定义的全局设置
@JsonFormat(不含=JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED)

问题在于JSON不是我手动编写的,而是框架:)。问题在于CXF没有返回正确的JSON。OP根本不提供JsON;CXF是。我必须将
serializeAsArray
设置为true,并将
arrayKeys
映射为数组的所有属性的键。还有。@Sacindhus你能再发一个问题吗?很好!“可选”arrayKeys属性不是那么可选。您必须显式地在JAXRSBean之外添加一个bean,并声明要保持序列化的所有数组属性。这会导致其他问题!这两个JsonProviders以不同的方式威胁@XMLElementWrapper。就我而言,杰克逊似乎根本不使用它
return Response.status(201).entity(jsonStr).build();
<jaxrs:server id="someid" address="/">
    <jaxrs:providers>
        <ref bean="jsonProvider" />      
    </jaxrs:providers> 

<bean id="jsonProvider"  lass="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
          <property name="mapper" ref="jsonMapper" /> </bean>   
<bean id="jsonMapper" class="com.bofa.idp.disclosures.CustomJsonMapper" /> 
public CustomJsonMapper() {
       super();
       enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
       enable(SerializationFeature.WRAP_ROOT_VALUE);
       enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
       JaxbAnnotationModule jaxbModule=new JaxbAnnotationModule();
       this.registerModule(jaxbModule);
       this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
       this.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

}