jackson转换字符串出错,帮我看看

hello涩郎 2016-08-03 12:23:38
这个是bean类:

public class Address {

//@DbColumnMapping("")
private String id;
private String addr;
/*@DbColumnMapping(value="ADDr")
private String adssdr;*/
/*public String getAdssdr() {
return adssdr;
}
public void setAdssdr(String adssdr) {
this.adssdr = adssdr;
}*/
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}

public Address() {
}
}


这个是用jackson转换的代码

public static List parseJsonStringToListWithBean(String jsonString, Class<?> collectionClass, Class<?> beansClass)
{
ObjectMapper mapper = new ObjectMapper();
try {
mapper.enableDefaultTyping();
JavaType javaType = getCollectionType(mapper, collectionClass, beansClass);
List rs = mapper.readValue(jsonString, javaType);
return rs;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public static JavaType getCollectionType(ObjectMapper mapper,Class<?> collectionClass, Class<?>... elementClasses) {
return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
}

//测试,调用parseJsonStringToListWithBean方法转换
public static void main(String[] args)
{
String str = "[{\"id\":\"10\",\"addr\":\"ss\"}]";
System.out.println(JSONUtils.parseJsonStringToListWithBean(str,List.class, Address.class));
//System.out.println(JSONUtils.parseJsonStringToListWithMap(str));
}


然后报错:

org.codehaus.jackson.map.JsonMappingException: Unexpected token (START_OBJECT), expected VALUE_STRING: need JSON String that contains type id (for subtype of java.util.List)
at [Source: java.io.StringReader@6be46e8f; line: 1, column: 2]
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.wrongTokenException(StdDeserializationContext.java:261)
at org.codehaus.jackson.map.jsontype.impl.AsArrayTypeDeserializer._locateTypeId(AsArrayTypeDeserializer.java:119)
at org.codehaus.jackson.map.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:87)
at org.codehaus.jackson.map.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromArray(AsArrayTypeDeserializer.java:45)
at org.codehaus.jackson.map.deser.std.CollectionDeserializer.deserializeWithType(CollectionDeserializer.java:232)
at org.codehaus.jackson.map.deser.StdDeserializerProvider$WrappedDeserializer.deserialize(StdDeserializerProvider.java:461)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1877)
at common.json.JSONUtils.parseJsonStringToListWithBean(JSONUtils.java:76)
at common.json.JSONUtils.main(JSONUtils.java:117)


这个转换方法我是从网上抄来的,不知道为什么不行,我把List.class换成ArrayList.class还是不行,到底哪里错了?如果这个不行,那么jackson把字符串转为List<Bean>这种要怎么写?
...全文
474 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_14976173 2016-08-10
  • 打赏
  • 举报
回复
,你的jar包什么版本的?
京城阿飞 2016-08-10
  • 打赏
  • 举报
回复
引用 5 楼 helloselang92 的回复:
[quote=引用 2 楼 anmiaochu 的回复:] main函数里的System.out.println(JSONUtils.parseJsonStringToListWithBean(str,List.class, Address.class));改为 System.out.println(JSONUtils.parseJsonStringToListWithBean(str,ArrayList.class, Address.class));亲测可以
不行,你的jar包什么版本的?难道我的版本问题?[/quote] import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.0</version> </dependency>
方丈的寺院 2016-08-10
  • 打赏
  • 举报
回复
引用 3 楼 FS1360472174 的回复:
和List<>,ArrayList没什么关系,你转换的是List<Address>类型,而不是List类型
private static void testWithJackson() {
		String str = "[{\"id\":\"10\",\"addr\":\"ss\"}]";
		ObjectMapper mapper = new ObjectMapper();
		JavaType javaType = getCollectionType(mapper, List.class, Address.class);
		List<Address> listAddress = null;
		try {
			listAddress = mapper.readValue(str, javaType);
		} catch (JsonParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JsonMappingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(listAddress);
	}
另外实现了google Gson版,觉得比jackson要简单点。有兴趣可以看下 https://github.com/FS1360472174/javaweb/blob/master/java-web/src/util/JsonStringtoListBean.java
什么不行,有什么问题,报了什么错? 已经测过了。 如果不行,拉下我github上的那个代码,jar都已经上传了。
hello涩郎 2016-08-09
  • 打赏
  • 举报
回复
引用 2 楼 anmiaochu 的回复:
main函数里的System.out.println(JSONUtils.parseJsonStringToListWithBean(str,List.class, Address.class));改为 System.out.println(JSONUtils.parseJsonStringToListWithBean(str,ArrayList.class, Address.class));亲测可以
不行,你的jar包什么版本的?难道我的版本问题?
hello涩郎 2016-08-09
  • 打赏
  • 举报
回复
引用 3 楼 FS1360472174 的回复:
和List<>,ArrayList没什么关系,你转换的是List<Address>类型,而不是List类型
private static void testWithJackson() {
		String str = "[{\"id\":\"10\",\"addr\":\"ss\"}]";
		ObjectMapper mapper = new ObjectMapper();
		JavaType javaType = getCollectionType(mapper, List.class, Address.class);
		List<Address> listAddress = null;
		try {
			listAddress = mapper.readValue(str, javaType);
		} catch (JsonParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JsonMappingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(listAddress);
	}
另外实现了google Gson版,觉得比jackson要简单点。有兴趣可以看下 https://github.com/FS1360472174/javaweb/blob/master/java-web/src/util/JsonStringtoListBean.java
-------------------------- 大神,你这个方法也还是不行啊,奇怪,网上那些人到底怎么转换的?
方丈的寺院 2016-08-05
  • 打赏
  • 举报
回复
和List<>,ArrayList没什么关系,你转换的是List<Address>类型,而不是List类型
private static void testWithJackson() {
		String str = "[{\"id\":\"10\",\"addr\":\"ss\"}]";
		ObjectMapper mapper = new ObjectMapper();
		JavaType javaType = getCollectionType(mapper, List.class, Address.class);
		List<Address> listAddress = null;
		try {
			listAddress = mapper.readValue(str, javaType);
		} catch (JsonParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JsonMappingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(listAddress);
	}
另外实现了google Gson版,觉得比jackson要简单点。有兴趣可以看下 https://github.com/FS1360472174/javaweb/blob/master/java-web/src/util/JsonStringtoListBean.java
京城阿飞 2016-08-03
  • 打赏
  • 举报
回复
main函数里的System.out.println(JSONUtils.parseJsonStringToListWithBean(str,List.class, Address.class));改为 System.out.println(JSONUtils.parseJsonStringToListWithBean(str,ArrayList.class, Address.class));亲测可以
hello涩郎 2016-08-03
  • 打赏
  • 举报
回复
没人啊?快来大神。。。

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧