2015-12-31 7 views
1

У меня есть ответ JSON, который выглядит следующим образом:Перебор вложенной Retrofit JSON результаты

{ 
    "1":{ 
    "id":"1", 
    "user_id":"1", 
    "children":[ 
    { 
     "id":"2", 
     "user_id":"2", 
     "children":[ 
     { 
     "id":"3", 
     "user_id":"3", 
     "children":[ 
     { 
      "id":"4", 
      "user_id":"2", 
      "children":[] 
     }] 
     }, 
     { 
     "id":"5", 
     "user_id":"1", 
     "children":[ 
     ] 
     } 
    ] 
    }, 
    { 
     "id":"6", 
     "user_id":"2", 
     "children":[ 
     ] 
    } 
    ] 
    }, 
    "7":{ 
    "id":"7", 
    "user_id":"2", 
    ... 
    } 
} 

Как вы можете видеть, я вложенные массивы (children). Мне нужно пройти через этот ответ JSON, проходя через каждый вложенный массив, пока он не запустится в пустой массив children, а затем сделает шаг назад, чтобы продолжить остальные элементы.

Я сделал класс модели для ответа, так что мой текущий код выглядит следующим образом:

RestClient.getService().getParents(new Callback<ParentResponse>() { 
    @Override 
    public void success(ParentResponse parentData, Response response) { 
    for (Parent parent : parentData.getData()) { 
     // 
    } 
    } 
} 

который, очевидно, только перебирает элементы верхнего уровня (идентификатор 1 и 7 в моем случае).

Модель для Parent класса выглядит следующим образом:

public class Parent { 
    private String id; 
    private String userId; 
    private List<Parent> parents = new ArrayList<Parent>(); 

    // get/set for id and userId 

    public List<Parent> getParents() { 
    return parents; 
    } 

    public void setParents(List<Parent> parents) { 
    this.parents = parents; 
    } 
} 

Как я могу это сделать?

ответ

0

Вы можете попробовать рекурсии ...

protected void doSomething(Parent p) { 
    ... some code here for all parents 
    if (p.getChildren().isEmpty()) { 
      ... some code here for empty parents 
    } else { 
      for(Parent child : getChildren()) { 
       doSomething(child); 
      } 
    } 
} 

Еще одна простая идея ...

public void doSomething(Parent p) { 
    Queue<Parent> toGo = new LinkedList<Parent>(p.getChildren()); 
    while(!toGo.isEmpty()) { 
    Parent toDo = toGo.poll(); 
    // do something with the element, if you need to 
    toGo.addAll(toGo.getChildren()); 
    } 
} 

Конечно, при этом вы не получите заказ вы хотите, так что вы можете захотеть немного поиграйте с этим решением. Но это может дать вам представление о том, как начать ...

+0

Что будет в моей петле foreach? – user5728705

+0

Ну, очевидно, 'doSomething (parent);' –