Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

流式读取包含有转义后的html字符串的json文件,抛出数组越界异常(版本1.2.23) #1001

Open
chenying99 opened this issue Jan 17, 2017 · 4 comments

Comments

@chenying99
Copy link

当json文件中包含有转义后的html字符串,流式读取json文件抛出数组越界异常

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at com.alibaba.fastjson.parser.JSONReaderScanner.next(JSONReaderScanner.java:171)
at com.alibaba.fastjson.parser.JSONLexerBase.scanString(JSONLexerBase.java:866)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:441)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1327)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1293)
at com.alibaba.fastjson.JSONReader.readString(JSONReader.java:209)

使用代码如下:

String objectKey = reader.readString();
System.out.println("objectKey:"+objectKey);
if(objectKey.equalsIgnoreCase("node"))
{

				reader.startArray();
				int count=0;
				while (reader.hasNext()) {
					
					
					
					String str=reader.readString();
					
					System.out.println("str:"+str);
					
					
					count++;
					System.out.println("---------------"+count+"-----------------");
					
					
				}
				reader.endArray();
			}
@wenshao
Copy link
Member

wenshao commented Jan 18, 2017

能提供重现问题的testcase么?

@chenying99
Copy link
Author

您好 我的测试文件有点大,不方便者这里贴出来

已上传到地址:
http://tlss.space/tmp/test.zip

其中json格式数据中的htmlContent字段的值 是(特殊字符) 转义后的html字符串,是程序输出的,一般不会存在格式问题

我测试的时候,如果修改htmlContent字段的值为 几个汉字,则fastjson程序能够正常读取,因此,问题在于fastjson读取 转义后的html字符串 存在bug

我的测试代码如下:

JSONReader reader = new JSONReader(new FileReader("test.json"));

	reader.startObject();

	int i = 0;
	while (reader.hasNext()) {
		// reader.readObject();//.readString();

		String key = reader.readString();

		System.out.println(key);
		System.out.println("计数:" + i);

		if (key.equalsIgnoreCase("sd")) {
			Object obj = reader.readObject();

		}

		if (key.equalsIgnoreCase("data")) {

			reader.startObject();// start
			String objectKey = reader.readString();
			System.out.println("objectKey:" + objectKey);
			if (objectKey.equalsIgnoreCase("node")) {
				// System.out.println("到了里面啦……");
				reader.startArray();
				int count = 0;
				while (reader.hasNext()) {

					/*
					 * reader.startObject(); while (reader.hasNext()) {
					 * String str = reader.readString();
					 * System.out.println(str); str = reader.readString();
					 * System.out.println(str);
					 * 
					 * } reader.endObject();
					 */

					/*
					 * String str = reader.readString();
					 * System.out.println(str);
					 */

					Map<String, Object> map = Maps.newHashMap();

					// Object obj=reader.readObject();

					// String str=reader.readString();

					reader.readObject(map);

					Iterator<String> itr = map.keySet().iterator();
					// System.out.println(map);
					while (itr.hasNext()) {
						String key2 = itr.next();
						Object value2 = map.get(key2);
						System.out.println(key2 + ":" + value2);
					}

					count++;
					System.out.println("---------------" + count + "-----------------");

				}
				reader.endArray();
			}
			objectKey = reader.readString();
			// System.out.println(objectKey+"是什么");

			if (objectKey.equalsIgnoreCase("event")) {
				reader.readObject();

			}

			reader.endObject();// end
		}

		i++;

	}
	reader.endObject();
	reader.close();

}

wenshao added a commit that referenced this issue Jan 21, 2017
@wenshao
Copy link
Member

wenshao commented Jan 21, 2017

谢谢反馈,问题重现并解决,不过才不到2M的文本,完全可以直接使用JSON.parseObject,不需要使用JSONReader

@chenying99
Copy link
Author

呵呵 辛苦了 ! 我可以用paRserObject,我的实际文件比这个大一点点啊!

不过这是一个比较关键的BUG,不解决 所有类似大文件都处理不了 @wenshao

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants