fastjson解析List<Object[]>类型数据在JDK7环境下报错

alvinte 发布于 2013/02/02 22:43
阅读 6K+
收藏 1

@wenshao 你好,想跟你请教个问题:

fastjson解析List<Object[]>类型数据在JDK7环境下报错。errorMessage如下:

Exception in thread "main" com.alibaba.fastjson.JSONException
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:475)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:211)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:171)
    at com.alibaba.fastjson.JSON.parseObject(JSON.java:292)
    at JTest.main(JTest.java:25)
Caused by: java.lang.NullPointerException
    at com.alibaba.fastjson.parser.deserializer.ArrayDeserializer.deserialze(ArrayDeserializer.java:31)
    at Fastjson_ASM_Clazz_1.deserialze(Unknown Source)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:471)
    ... 4 more

测试类就三个。如下:

public class User{
	public User() {
	}
	public User(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}

	private int age;
	private String name;

	@Override
	public String toString() {
		return "User [age=" + age + ", name=" + name + "]";
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
import java.util.List;

public class Group {
	List<User[]> userArrList;
	public Group(){}
	public List<User[]> getUserArrList() {
		return userArrList;
	}

	public void setUserArrList(List<User[]> userArrList) {
		this.userArrList = userArrList;
	}
}
import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSON;

public class JTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<User[]> list = new ArrayList<User[]>();
		User u1 = new User(1, "111111");
		User u2 = new User(2, "222222");
		User u3 = new User(3, "33333");
		User u4 = new User(4, "4444");
		list.add(new User[] { u1, u2 });
		list.add(new User[] { u3, u4 });
		Group clz = new Group();
		clz.setUserArrList(list);
		String json = JSON.toJSONString(clz);
		System.out.println(json);
		Group clz1 = JSON.parseObject(json, Group.class);
		System.out.println(clz1.getUserArrList().get(1)[1].getName());
	}

}
补充说明:

1、引入fastjson-1.1.26.jar,在JDk1.6环境下没问题,在JDK1.7环境下报上述错误。调试可知,在com.alibaba.fastjson.parser.deserializer.ArrayDeserializer.deserialze这个方法中,传入的参数Type type值为null

2、推测可能是编译问题,但是发现不是,因为:直接导入fastjson源码,不行。修改编译级别到1.6\1.5,都不行。

3、其他相关类型如List<Object>、Object[][]都测试没有parser问题。

4、以上结论经过@JFinal 核实确认,感谢@JFinal。

还请温少及各位大牛帮忙看一下这个问题,谢谢。

以下是问题补充:

@alvinte:@wenshao 上次jdk7的问题非常感谢及时解决,谢谢。但是现在又发现新问题了。还是基于List<Object[]>的问题,这次是更具体化的List<char[]>:可知fastjson对于char[]本身是看做字符串处理的,但是对于List<char[]>生成成的数据是等同于List<String>的,但是解析的时候List <char[]>却被看做List<数组>,这样就要求token为[[ ]]导致解析时报错。烦请@wenshao大神再处理一下吧……多谢啦。 (2013/03/08 17:00)
加载中
1
wenshao
wenshao

通过这个问题,了解到Java6和Java7中List<User[]>的类型信息是不一样的。在Java6中"User[]"是一个GenericArrayType,而在Java7中则是User[].class。

问题已经修复,请使用最新快照:

http://code.alibabatech.com/mvn/snapshots/com/alibaba/fastjson/1.1.28-SNAPSHOT/

a
alvinte
@wenshao ,又有新的问题了,麻烦给看看,具体请看补充话题。多谢啦。
0
绝望的八皮
绝望的八皮
但是在我和另一位同事的1.7上没问题。。。。
0
wenshao
wenshao
我测试的是linux Oracle java 1.7.0_10和1.7.0_11
a
alvinte
我是win x86 1.7.0_03 和 1.7.0_11,可以推测得出03-11版本应该都是一样的,因为没理由中间改过一次又改回来。另外,装了jdk1.7不等于用的就是jdk1.7吧
返回顶部
顶部