繁体   English   中英

在Java中展平JSONObject - 导致StackOverflowError的递归

[英]Flattening a JSONObject in Java - Recursion causing StackOverflowError

我一直在编写一种方法来“压扁”Java中的codehaus JSONObject 不幸的是,我在通过对象嵌套的递归中看到了StackOverflowError,但我发现很难调试。 这是我看到的错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:345)
    at java.util.LinkedHashMap$LinkedHashIterator.<init>(LinkedHashMap.java:345)
    at java.util.LinkedHashMap$KeyIterator.<init>(LinkedHashMap.java:383)
    at java.util.LinkedHashMap$KeyIterator.<init>(LinkedHashMap.java:383)
    at java.util.LinkedHashMap.newKeyIterator(LinkedHashMap.java:396)
    at java.util.HashMap$KeySet.iterator(HashMap.java:874)
    at org.codehaus.jettison.json.JSONObject.keys(JSONObject.java:533)
    at org.codehaus.jettison.json.JSONObject.toString(JSONObject.java:1079)
    at org.codehaus.jettison.json.JSONObject.valueToString(JSONObject.java:1210)

我正在使用Iterator循环键,并使用hasNext()next()来确保我应该只能访问特定的对象键。

我开始使用简单的JSONObject进行测试:

JSONObject json = new JSONObject("outer":{"field1":"value","inner":{"field2":12345,"field3":"example@example.com"}});

/*
"outer":{
    "field1":"value",
    "inner":{
        "field2":12345,
        "field3":"example@example.com"
    }
}
*/

这应该导致包含fields1|2|3的单个嵌套。

这是我到目前为止的代码:

private static JSONObject flatten(JSONObject object, JSONObject flattened){
    if(flattened == null){
        flattened = new JSONObject();
    }
    Iterator<?> keys = object.keys();
    while(keys.hasNext()){
        String key = (String)keys.next();
        try {
            if(object.get(key) instanceof JSONObject){
                flattened.put(key, flatten(object.getJSONObject(key), flattened));
            } else {
                flattened.put(key, object.get(key));
            }
        } catch(JSONException e){
            System.out.println(e);
        }
    }
    return flattened;
}

我已经调试了一段时间了,但是还没有取得任何进展 - 所以我很感激任何指针。 在此先感谢您的帮助 - 如果需要更多信息,请发表评论。

更换

flattened.put(key, flatten(object.getJSONObject(key), flattened));

通过

flatten(object.getJSONObject(key), flattened);

在这里它给了我{"field1":"value","field2":12345,"field3":"example@example.com"}我觉得这就是你想要的

请注意,当您以递归方式调用函数时,将“flattened”对象传递给函数,然后将其返回给您,然后将其添加到“flattened”。 因此,您将对象添加到自身,创建循环引用

执行递归调用时,请不要将结果添加回对象。 做就是了:

flatten(object.getJSONObject(key), flattened);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM