程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

将多级字符串转换为 jsonobject 导致 java.lang.StackOverflowError

发布于2023-11-05 20:41     阅读(1147)     评论(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)
                             ...

以下是我的示例代码

  1. 我的 JSON 字符串:http://www.filehosting.org/file/details/454634/test.txt
  2. 主要Java代码:

注意:我尝试使用其他库(例如 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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

8 0
收藏该文
已收藏

评论内容:(最多支持255个字符)