Сглаживание JSONObject в Java-рекурсии, вызывающей StackOverflowError



Я писал метод для "сглаживания" кода . 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":"[email protected]"}});

/*
"outer":{
"field1":"value",
"inner":{
"field2":12345,
"field3":"[email protected]"
}
}
*/


Это должно привести к одиночное гнездо, содержащее 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;
}


Я уже некоторое время отлаживаю это, но не смог продвинуться вперед - так что я был бы признателен за любые указания с этим. Заранее спасибо за любую помощь - если вам нужна дополнительная информация, просто оставьте комментарий.

582   2  

2 ответов:

Заменить

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

By

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

Вот он дает мне {"field1":"value","field2":12345,"field3":"[email protected]"} и я думаю, что это то, что вы хотите

Обратите внимание, что при рекурсивном вызове функции вы передаете "сплющенный" объект в функцию, а затем она возвращает его вам, который затем добавляется в "сплющенный". Таким образом, вы добавляете объект к самому себе, создавая круговую ссылку

Когда вы выполняете рекурсивный вызов, не добавляйте результат обратно в объект. Просто сделайте:

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

Comments

    Ничего не найдено.