Сглаживание 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;
}
Я уже некоторое время отлаживаю это, но не смог продвинуться вперед - так что я был бы признателен за любые указания с этим. Заранее спасибо за любую помощь - если вам нужна дополнительная информация, просто оставьте комментарий.
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