GVKun编程网logo

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

8

如果您想了解泽西岛:无法从字符串中反序列化ArrayList的实例的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析ArrayList的序列化、JavaArraylist无法从START_OBJ

如果您想了解泽西岛:无法从字符串中反序列化ArrayList的实例的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析ArrayList 的序列化、Java Arraylist 无法从 START_OBJECT 令牌反序列化实例、Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?、java – 类型不匹配:无法从ArrayList转换为List的各个方面,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

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

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

我有一个使用以下实现的基于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服务,以便在将数组字段作为单个元素发送给我时能够反序列化数组字段。

先感谢您!

答案1

小编典典

经过漫长的一天,又是…阅读了许多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的功能。

ArrayList 的序列化

ArrayList 的序列化

概念:

1)序列化一个对象时,被transient关键字修饰的变量(的值)不会被序列化。

ArrayList的序列化机制:
1)ArrayList实现了java.io.Serializable接口。
2)ArrayList中存放集合元素的Object数组被关键字transient修饰。代码:transient Object[] elementData;
3)ArrayList序列化集合元素的机制:
	ArrayList在序列化时会调用writeObject(ObjectOutputStream s)方法,将sizeelement写入ObjectOutputStream中;
	ArrayList在反序列化时调用readObject(java.io.ObjectInputStream s)方法,从ObjectInputStream中获取到sizeelement,再恢复到存储集合元素的Object数组中。

4)与直接序列化Object数组相比,这样的机制有什么优点呢?

	elementData是一个Object数组,它通常会预留一些容量,等容量不足时再进行扩容;有些空间(elementData[size] ~ elementData[elementData.length-1])实际上并没有存储元素(存的是null);
	ArrayList的序列化机制:只序列化实际存储的集合元素,而不是去实例化整个Object数组,从而节省空间和时间的消耗。

Java Arraylist 无法从 START_OBJECT 令牌反序列化实例

Java Arraylist 无法从 START_OBJECT 令牌反序列化实例

如何解决Java Arraylist 无法从 START_OBJECT 令牌反序列化实例?

出现错误:

java.lang.IllegalArgumentException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
java.lang.IllegalArgumentException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
java.lang.IllegalArgumentException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

   

ServiceImpl:

List<CarType> carTypeList=MapResponse.getCarTypes(response.getResponseBody());
        

地图响应

public static java.util.List<com.abc.first.model.CarType> getCarTypes(Object response) {
    java.util.List<com.abc.second.model.CarType> Response = objectMapper.convertValue(response,new TypeReference<List<com.abc.second.model.CarType>>() {
            });

    java.util.List<com.abc.first.model.CarType> Response2 = new java.util.ArrayList();

    com.abc.first.model.CarType mobModel = null;
    for (com.abc.second.model.CarType hmbModel : Response) {
        mobModel = new com.abc.first.model.CarType();
        mobModel.setId(hmbModel.getId());
        mobModel.setName(hmbModel.getName());
        Response2 .add(mobModel);
    }
    return Response2;
}
    
        

课程:

com.abc.first.model.CarType:

public class CarType{
    private int id;
    private String name;

    public CarType(int id) {
        this.id = id;
    }

    public CarType(String name) {
        this.name = name;
    }

    public CarType(int id,String name) {
        this.id = id;
        this.name = name;
    }

    public CarType() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

    
        

课程:

com.abc.second.model.CarType:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

@JsonInclude(Include.NON_NULL)
public class CarType {
    private int id;
    private String name;

    public CarType () {
    }

    public CarType (String name) {
        this.name = name;
    }

    public CarType (int id) {
        this.id = id;
    }

    public CarType (int id,String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?

Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?

我想保留我的子类通用,所有我想要改变的是ArrayList的add(Object)方法,以便在调用arrayList.add(null)时不添加任何东西(ArrayList的正常实现将会添加null ;我想让它什么都不做)

解决方法

在这种情况下,您应该优先于继承的组合,因为如果您忘记覆盖ArrayList中添加/更改元素的一种方法(例如,您可以忘记覆盖集合),那么仍然可以使用空元素.

但是由于问题是关于如何子类化ArrayList,所以你可以这样做:

import java.util.ArrayList;

public class MyArrayList<T> extends ArrayList<T> {
    public boolean add(T element) {
        if (element != null) return super.add(element);
        return false;
    }
}

java – 类型不匹配:无法从ArrayList转换为List

java – 类型不匹配:无法从ArrayList转换为List

我只有这样,但我的编译器说:类型不匹配:不能从ArrayList转换为List
那么任何人都可以告诉我什么问题?我使用Elipse Java EE IDE.
import java.awt.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;


public class Main {
    public static void main(String[] args) {
        List list = new ArrayList();


    }
}

解决方法

导入不正确,它必须是java.util.List.

今天关于泽西岛:无法从字符串中反序列化ArrayList的实例的介绍到此结束,谢谢您的阅读,有关ArrayList 的序列化、Java Arraylist 无法从 START_OBJECT 令牌反序列化实例、Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?、java – 类型不匹配:无法从ArrayList转换为List等更多相关知识的信息可以在本站进行查询。

本文标签: