如果您想了解泽西岛:无法从字符串中反序列化ArrayList的实例的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析ArrayList的序列化、JavaArraylist无法从START_OBJ
如果您想了解泽西岛:无法从字符串中反序列化ArrayList的实例的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析ArrayList 的序列化、Java Arraylist 无法从 START_OBJECT 令牌反序列化实例、Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?、java – 类型不匹配:无法从ArrayList转换为List的各个方面,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- 泽西岛:无法从字符串中反序列化ArrayList的实例
- ArrayList 的序列化
- Java Arraylist 无法从 START_OBJECT 令牌反序列化实例
- Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?
- java – 类型不匹配:无法从ArrayList转换为List
泽西岛:无法从字符串中反序列化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和常见问题解答之后,它终于可以工作了。
我做了什么:
- 使用杰克逊
- 强制Jackson提供商使用
- 定义自定义反序列化器
- 激活ACCEPT_SINGLE_VALUE_AS_ARRAY标志
- 修复依赖关系
故事:
我正在使用默认情况下使用(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 的序列化
概念:
1)序列化一个对象时,被transient关键字修饰的变量(的值)不会被序列化。
ArrayList的序列化机制:
1)ArrayList实现了java.io.Serializable接口。
2)ArrayList中存放集合元素的Object数组被关键字transient修饰。代码:transient Object[] elementData;
3)ArrayList序列化集合元素的机制:
ArrayList在序列化时会调用writeObject(ObjectOutputStream s)方法,将size和element写入ObjectOutputStream中;
ArrayList在反序列化时调用readObject(java.io.ObjectInputStream s)方法,从ObjectInputStream中获取到size和element,再恢复到存储集合元素的Object数组中。
4)与直接序列化Object数组相比,这样的机制有什么优点呢?
elementData是一个Object数组,它通常会预留一些容量,等容量不足时再进行扩容;有些空间(elementData[size] ~ elementData[elementData.length-1])实际上并没有存储元素(存的是null);
ArrayList的序列化机制:只序列化实际存储的集合元素,而不是去实例化整个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的子类?
解决方法
但是由于问题是关于如何子类化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
那么任何人都可以告诉我什么问题?我使用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(); } }
解决方法
今天关于泽西岛:无法从字符串中反序列化ArrayList的实例的介绍到此结束,谢谢您的阅读,有关ArrayList 的序列化、Java Arraylist 无法从 START_OBJECT 令牌反序列化实例、Java – 如何子类化通用的ArrayList,使MyArrayList的实例将成为ArrayList的子类?、java – 类型不匹配:无法从ArrayList转换为List等更多相关知识的信息可以在本站进行查询。
本文标签: