我有使用实现了基于REST的Web服务JSON:码头,新泽西州,新泽西州的JSON使用杰克逊。
我的一个方法接收Person实例,其具有类型为List的场<字符串>。 即:
Public class Person {
List<String> names;
}
如果我有名字的数组调用它,一切工作正常! 例如:
{ "names" : [ "Jhon", "Doe" ] }
但是,如果人只有一个名字,我的客户端创建一个单一的价值元素,如:
{ "names" : "Jhon" }
当我尝试调用相同的值的服务,我得到一个异常:
Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token
题:
我应该如何创建/配置我的网络服务,以便能够反序列化数组字段时,它们是作为一个单一的元素送给我的。
-
我已经阅读:
杰克逊反序列化-与包含的ArrayList <T>
和
如何定制JAXB对象JSON的名单序列化?
这是指最后的答案:
Jersey客户端无法deserializable JSON服务-异常(无法反序列化实例)
JAXB JSON缺少一个元素阵列括号
但这些都不解决问题。
先感谢您!
经过漫长的一天,另一个...阅读大量wiki和常见问题解答后后,最终的作品。
我做了什么:
- 使用杰克逊
- 力杰克逊提供商使用
- 定义自定义解串器
- 激活ACCEPT_SINGLE_VALUE_AS_ARRAY标志
- 修复依赖
故事:
我用的是新泽西州1.13是默认使用JAXB(我相信)。
我改成了用杰克逊
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
如在描述:
https://stackoverflow.com/a/13895768/660990
这让我的球衣使用杰克逊,但问题仍然存在; 杰克逊不能解串器阵列尚未。
我强迫杰克逊提供商的用法:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
your.project.packages;
org.codehaus.jackson.jaxrs</param-value>
</init-param>
https://stackoverflow.com/a/3143214/660990
是一个必要的步骤,但还不够。 因此,有必要启动ACCEPT_SINGLE_VALUE_AS_ARRAY标志。
ObjectMapper objectMapper;
objectMapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
我需要定义自定义解串器
public class MyResolver implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(final Class<?> objectType) {
...
return objectMapper;
}
}
为了做到这一点:
定制-ObjectMapper
做了这一切之后,它仍然没有工作...
经过一些搜索时间,我发现:
杰克逊2.0泽西1.12
这讨论的依赖问题 ..
这陶醉了我的问题,与杰克逊v1.9.2的 球衣V1.13船,我需要杰克逊V2.0
我取消了球衣JSON的依赖,因为它包括杰克逊1.9.2:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
</dependency>
直接宣布的依赖性:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
参考:
杰克逊JAXRS JSON的提供商
注:此更改消除了使用JAXB或抛弃泽西能力。
题外话 ,可能有人很有趣:
配置新泽西州/杰克逊不使用@XmlElement场标注为JSON的字段命名
您可以使用在类,字段或方法级别的注解做到这一点JsonFormat注释
@JsonFormat(with = Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
protected List<String> list;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
例如5.10和5.11 这页说明您的具体问题。 您可以配置JSON建设者,迫使单项目列表阵列,像这样: JSONConfiguration.mapped().arrays("names").build()
它的工作对我来说,加入@JsonSerialize到类
@JsonSerialize
Public class Person {
List<String> names;
}
{"results": {"place": {"lang": "en-US","woeid": "2168606"}}}
&
{"results": {"place": [{"lang": "en-US","woeid": "2168606"}, {"lang": "en-US","woeid": "2168606"}]}}
这种类型的使用雅虎的地方API时,该怎么办?