2014-02-18 7 views
1

У меня есть дерево JSON-структурированные данные. Что-то вродеAndroid parse json tree

{ 
"result": [ 
    { 
     "id": 1, 
     "name": "test1" 
    }, 
    { 
     "id": 2, 
     "name": "test12", 
     "children": [ 
      { 
       "id": 3, 
       "name": "test123", 
       "children": [ 
        { 
         "id": 4, 
         "name": "test123" 
        } 
       ] 
      } 
     ] 
    } 
] 

}

модель:

class DataEntity { 
    int id; 
    String name; 
    List<DataEntity> childDataEntity; 
} 

Синтаксический через org.json

List<DataEntity> categories = new ArrayList<DataEntity>(); 

private List<DataEntity> recursivellyParse(DataEntity entity, JSONObject object) throws JSONException { 
    entity.setId(object.getInt("id")); 
    entity.setName(object.getString("name")); 
    if (object.has("children")) { 
     JSONArray children = object.getJSONArray("children"); 
     for (int i = 0; i < children.length(); i++) { 
      entity.setChildDataEntity(recursivellyParse(new DataEntity(), children.getJSONObject(i))); 
      categories.add(entity); 
     } 
    } 
    return categories; 
} 

вызов

JSONObject jsonObject = new JSONObject(JSON); 
     JSONArray jsonArray = jsonObject.getJSONArray("result"); 
     for (int i = 0; i < jsonArray.length(); i++) { 
      recursivellyParse(new DataEntity(), jsonArray.getJSONObject(i)); 
     } 

Но этот путь неправильный. После выполнения метода List заполнил те же данные.

Как правильно разобрать его?

UPD: обновление JSON.

+1

Ваш ответ недействителен, проверьте здесь http://jsonlint.com/ –

+0

Я редактирую строку json. –

+0

@YuriyAizenberg: Я столкнулся с той же проблемой .. Я не получил решение, написанное ниже. Не могли бы вы рассказать мне, какие изменения вы сделали, чтобы заставить его работать? – Neha

ответ

1

Игнорирование того, что JSON, который вы показываете, является недопустимым (я предполагаю, что это проблема с копией/вставкой или опечатка), проблема в том, что вы объявили свой список categories как член любого объекта.

Он постоянно добавляется к каждому звонку до recursivellyParse() и эти данные остаются в списке. Каждый последующий вызов из вашего цикла видит все предыдущие вызовы, помещенные в него.

Простое решение этой проблемы, как ваш код написан будет просто добавить вторую версию, которая очищает список:

private List<DataEntity> beginRecursivellyParse(DataEntity entity, 
             JSONObject object) throws JSONException { 

    categories.clear(); 
    return recursivellyParse(entity, object); 
} 

Затем называют, что из вашего цикла.

+0

Да, я понимаю, что проблема в рекурсивном вызове. Но не совсем понимаю, как это сделать правильно. Не могли бы вы показать мне правильную версию? –

+0

@YuriyAizenberg см. Редактировать; это один из способов его решения –

+0

Thx, это решает мою проблему. –

1

Полный демоверсия Как анализировать данные json, как вы хотите.

String JSON = "your json string"; 
    ArrayList<DataEntity> finalResult = new ArrayList<>(); 


    try { 
       JSONObject main = new JSONObject(JSON); 

       JSONArray result = main.getJSONArray("result"); 

       for(int i=0;i<result.length();i++){ 
        DataEntity dataEntity = parseObject(result.getJSONObject(i)); 
        finalResult.add(dataEntity); 
       } 

       Log.d("DONE","Done Success"); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

Создать одну рекурсивную функцию для разбора объекта.

public DataEntity parseObject(JSONObject dataEntityObject) throws JSONException { 
    DataEntity dataEntity = new DataEntity(); 
    dataEntity.id = dataEntityObject.getString("id"); 
    dataEntity.name = dataEntityObject.getString("name"); 

    if(dataEntityObject.has("children")){ 
     JSONArray array = dataEntityObject.getJSONArray("children"); 
     for(int i=0;i<array.length();i++){ 
      JSONObject jsonObject = array.getJSONObject(i); 
      DataEntity temp = parseObject(jsonObject); 
      dataEntity.children.add(temp); 
     } 
    } 

    return dataEntity; 
} 

Модель класса

public class DataEntity implements Serializable { 
public String id = ""; 
public String name = ""; 
ArrayList<DataEntity> children = new ArrayList<>();} 

В FinalResult Arraylist вы получите все ваши данные синтаксического анализа.

+0

Хотя ваш ответ может быть правильным, было бы лучше, если вы также указали, что было неправильным с кодом плаката.Обратите внимание, что принятый ответ был гораздо более актуальным для этого вопроса. –