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

时间:2014-08-05 08:37:00

标签: java json jsonobject

我正在使用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代码:
  3.   

    注意:我试图用其他库测试我的json字符串   作为gson-2.2.4.jar和json-simple-1.1.1.jar,两个库都可以正常工作。

    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();
            }
        }
    }
    

    我该如何解决这个问题?

    提前致谢。

    earist

1 个答案:

答案 0 :(得分:1)

问题是你的JSON太深了“#39;嵌套属性太多了。 org.json解析器获取StackOverflowError,因为有太多的递归方法调用。

即使您更改了json库,当您尝试递归遍历已解析的对象时,仍然可以运行相同的问题。

例如,如果您尝试用Gson打印对象

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(json);

与json-simple相同:

String json = parsed.toJSONString();

要解决此问题,您应该重新考虑JSON结构或增加JRE堆栈大小f.x. -Xss4m