球衣号码:无法反序列化ArrayList中的实例进行字符串(Jersey: Can not dese

2019-07-18 04:47发布

我有使用实现了基于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缺少一个元素阵列括号

但这些都不解决问题。

先感谢您!

Answer 1:

经过漫长的一天,另一个...阅读大量wiki和常见问题解答后后,最终的作品。

我做了什么:

  1. 使用杰克逊
  2. 力杰克逊提供商使用
  3. 定义自定义解串器
  4. 激活ACCEPT_SINGLE_VALUE_AS_ARRAY标志
  5. 修复依赖

故事:

我用的是新泽西州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的字段命名



Answer 2:

您可以使用在类,字段或方法级别的注解做到这一点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;
}


Answer 3:

例如5.10和5.11 这页说明您的具体问题。 您可以配置JSON建设者,迫使单项目列表阵列,像这样: JSONConfiguration.mapped().arrays("names").build()



Answer 4:

它的工作对我来说,加入@JsonSerialize到类

@JsonSerialize
Public class Person {
    List<String> names;
}


Answer 5:

{"results": {"place": {"lang": "en-US","woeid": "2168606"}}}

{"results": {"place": [{"lang": "en-US","woeid": "2168606"}, {"lang": "en-US","woeid": "2168606"}]}}

这种类型的使用雅虎的地方API时,该怎么办?



文章来源: Jersey: Can not deserialize instance of ArrayList out of String