发布于2023-11-05 20:41 阅读(1047) 评论(0) 点赞(8) 收藏(3)
我使用 Java 7 和 org.json-20120521.jar 将 json 字符串转换为 JSONObject。然后该对象将在另一个方法中使用
我的 json 字符串包含多个级别。当我解析字符串时,错误消息将被抛出
Exception in thread "main" java.lang.StackOverflowError
at java.lang.CharacterDataLatin1.digit(Unknown Source)
at java.lang.Character.digit(Unknown Source)
at java.lang.Character.digit(Unknown Source)
at java.lang.Long.parseLong(Unknown Source)
at java.lang.Long.<init>(Unknown Source)
at org.json.JSONObject.stringToValue(JSONObject.java:1279)
at org.json.JSONTokener.nextValue(JSONTokener.java:389)
at org.json.JSONObject.<init>(JSONObject.java:212)
at org.json.JSONTokener.nextValue(JSONTokener.java:363)
at org.json.JSONObject.<init>(JSONObject.java:212)
...
以下是我的示例代码
注意:我尝试使用其他库(例如 gson-2.2.4.jar 和 json-simple-1.1.1.jar)测试我的 json 字符串,这两个库都工作正常。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import org.json.JSONObject;
import org.json.simple.parser.JSONParser;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
*
*/
public class TestJSON
{
/**
* @param args
*/
public static void main(String[] args)
{
FileInputStream stream = null;
try
{
stream = new FileInputStream(new File("test.txt"));
Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
StringBuilder builder = new StringBuilder();
char[] buffer = new char[8192];
int read;
while ((read = reader.read(buffer, 0, buffer.length)) > 0)
{
builder.append(buffer, 0, read);
}
String str = builder.toString();
convertByGSON(str);
convertByJSON(str);
convertBySimple(str);
}
catch (Exception e)
{
}
finally
{
try
{
stream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
private static void convertByJSON(String str)
{
try
{
JSONObject json = new JSONObject(str);
System.out.println("Finish1");
}
catch (Exception e)
{
e.printStackTrace();
}
catch (Error e)
{
e.printStackTrace();
}
}
private static void convertByGSON(String str)
{
try
{
JsonParser parser = new JsonParser();
JsonElement jsonE = parser.parse(str);
JsonObject json = jsonE.getAsJsonObject();
System.out.println("Finish2");
}
catch (Exception e)
{
e.printStackTrace();
}
catch (Error e)
{
e.printStackTrace();
}
}
private static void convertBySimple(String str)
{
try
{
JSONParser parser = new JSONParser();
org.json.simple.JSONObject parsed = (org.json.simple.JSONObject)parser.parse(str);
System.out.println("Finish3");
}
catch (Exception e)
{
e.printStackTrace();
}
catch (Error e)
{
e.printStackTrace();
}
}
}
我怎么解决这个问题?
提前致谢。
耳朵主义者
问题是你的 JSON 太“深”了。嵌套属性太多。org.json 解析器收到 StackOverflowError 是因为递归方法调用过多。
即使您更改了 json 库,当您尝试递归遍历已解析的对象时,仍然可能会遇到同样的问题。
例如,如果您尝试使用 Gson 漂亮地打印对象
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(json);
与 json-simple 相同:
String json = parsed.toJSONString();
要解决此问题,您应该重新考虑 JSON 结构或增加 JRE 堆栈大小 fx -Xss4m
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/677433/47373749708c9ecfa34e/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!