当前位置: 首页 > 面试题库 >

泽西岛:无法从字符串中反序列化ArrayList的实例

赵锐
2023-03-14
问题内容

我有一个使用以下实现的基于json的REST Web服务:使用Jackson的Jetty,Jersey,Jersey-JSON。

我的方法之一收到一个Person实例,该实例的字段类型为List <String>。即:

Public class Person {
    List<String> names;
}

如果我使用名称数组来调用它,一切正常!例如:

{ "names" : [ "Jhon", "Doe" ] }

但是,如果该人只有一个名字,我的客户会创建一个值元素,例如:

{ "names" : "Jhon" }

当我尝试使用单个值调用服务时,出现异常

Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token

题:

我应该如何创建/配置Web服务,以便在将数组字段作为单个元素发送给我时能够反序列化数组字段。

先感谢您!


问题答案:

经过漫长的一天,又是…阅读了许多Wiki和常见问题解答之后,它终于可以工作了。

我做了什么:

  1. 使用杰克逊
  2. 强制Jackson提供商使用
  3. 定义自定义反序列化器
  4. 激活ACCEPT_SINGLE_VALUE_AS_ARRAY标志
  5. 修复依赖关系

故事:

我正在使用默认情况下使用(I belive)jaxb的Jersey 1.13。

我将其更改为 使用杰克逊

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

如以下所述:

这使我的球衣使用杰克逊,但问题仍然存在。杰克逊还不能反序列化数组。

我强迫使用 Jackson提供商

<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>

是必要的步骤,但还不够。必须激活 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;
    }
}

为了做到这一点:

定制对象映射器

完成所有这些操作后,它仍然无法正常工作…

那讨论 依赖问题 ..

这反映了我的问题, Jackson v1.9.2 附带了 Jersey v1.13我需要Jackson v2.0

我删除了jersey-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>

参考:

jackson-jaxrs-json-provider

注意: 此更改将删除Jersey的使用Jaxb或Jettison的功能。



 类似资料:
  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是

  • 使用Spring1.5.8释放Jackson mapper,给出以下异常。 在[源:未知;行:-1,列:-1](通过引用链:com.copart.conversationapi.CallDisposition.model.vo.CallLogEntity[“CallEndTime”]) Callentity.java java pom.xml

  • 我正在尝试将以下有效负载发布到我基于Jersey的web服务: 我的泽西岛代码: 就在Jersey给我打电话的时候,我停下了,我看到了我正在寻找的地址(上面JSON中的内容)。然而,我的数据元组不在那里。我知道Jersey正在为地址es调用我的无参数构造函数,它的setters也在被调用,但是我还没睡,因为Jersey可能会也可能不会尝试对JSON中的这些随机("数据")元组做些什么。(我说“随机

  • 问题内容: 我设置了一个Eclipse WebApp项目,并将Jersey和Jackson JAR放在WEB-INF / lib目录中。我想使用JSON序列化,但无法解决此错误: 在 WEB-INF / lib目录 文件夹包含以下JAR: web.xml : Greeting.java : WebApp项目在嵌入式Tomcat v7服务器中运行(在eclipse中查看“服务器”)。 要求 : 只要

  • 由于以下异常,我无法反序列化Java-8-locatedate JSON分析错误:无法从字符串“15/09/1978”反序列化< code>java.time.LocalDate类型的值:无法反序列化Java . time . local date(Java . time . format。无法在索引0处分析DateTimeParseException)文本“15/09/1978”; 包含Date