2016-07-21 2 views
1

Привет всем Я пытаюсь разобрать JSON-файл из этого LINK.JSON parse for TFL Open Data

Возвращенный JSON является следующим образом-

enter image description here

мне нужно для перебора всех экземпляров journeys во-первых, то у меня есть цикл по legs для каждого journeys, чтобы получить detailed инструкция. Как вы можете видеть каждый legs состоит из instruction в части, которая возвращает string, моя конечная цель состоит в том, чтобы объединить эти string для каждого путешествия и отображать их как TextView. Таким образом, для приведенного выше JSON конечной целью является, чтобы показать -

Юбилейной линии к Stratford, или Северной Гринвич

Северной линии в направлении Эджвар, или High Барнет

До сих пор Я пробовал пройти через этот JSON без везения.

Вот код, я работаю on-

try { 
     //object is the JSON file. 
     JSONArray Journey = object.getJSONArray("journeys"); 
     if (Journey != null) { 
     //Retrieving number of possible routes. 
     for (int i=0;i<Journey.length();i++){ 
      Routes.add(Journey.getJSONObject(i)); 
     } 
     //Retrieving number of possible legs for each route. 
     if (!Routes.isEmpty()){ 
     for (int j = 0; j< Routes.size(); j++){ 
      Legs.add(j, Routes.get(j).getJSONArray("legs")); 
     } 
     //Trying to retrieve the detailed instruction here and failing. 
     for(int k=0;k<Routes.get(k).getJSONArray("legs").length();k++){ 
      instructionDetail.add(k,Legs.get(k).getJSONObject(k).getJSONObject("instruction")); 

     } 
    } 
} 

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

Я считаю, что мой подход является неправильным, и я не получил право рамочного .. Предложений для разбора и навигации и любой другой подход будет высоко оценили!

Спасибо!

UPDATE:

enter image description here enter image description here

ответ

1
JSONArray journeys = new JSONObject(""); 
     for(int i = 0 ; i < journeys.length() ; i++) { // Traverse journeys 
      JSONObject journey = journeys.getJSONObject(i); // get journeys(i) -> journey 
      if(journey.has("legs")) { // if journey has "legs" key 
       JSONArray legs = journey.getJSONArray("legs"); // get the legs array from journey object 
       for(int j = 0 ; j < legs.length() ; j++) { // Traverse legs 
        JSONObject leg = legs.getJSONObject(j); // get legs(j) -> leg 
        if(leg.has("instruction")) { // if leg has "instruction" key in it 
         JSONObject instruction = leg.getJSONObject("instruction"); // get instruction jsonObject 
         String detailed = instruction.optString("detailed", "Fallback detailed"); // get detailed string in instruction object 
        } 
       } 
      } 
     } 

Update:

private static class Detail { 
     String journeyType; 
     String legType; 
     String instructionType; 
     String detail; 

     public Detail(String journeyType, String legType, String instructionType, String detail) { 
      this.journeyType = journeyType; 
      this.legType = legType; 
      this.instructionType = instructionType; 
      this.detail = detail; 
     } 
    } 

... ...

List<Detail> detailList = new ArrayList<>(); 
     JSONArray journeys = new JSONObject(""); 
     for(int i = 0 ; i < journeys.length() ; i++) { // Traverse journeys 
      JSONObject journey = journeys.getJSONObject(i); // get journeys(i) -> journey 
      if(journey.has("legs")) { // if journey has "legs" key 
       JSONArray legs = journey.getJSONArray("legs"); // get the legs array from journey object 
       for(int j = 0 ; j < legs.length() ; j++) { // Traverse legs 
        JSONObject leg = legs.getJSONObject(j); // get legs(j) -> leg 
        if(leg.has("instruction")) { // if leg has "instruction" key in it 
         JSONObject instruction = leg.getJSONObject("instruction"); // get instruction jsonObject 
         String journeyType = journey.getString("$type"); 
         String legType = leg.getString("$type"); 
         String instructionType = instruction.getString("$type"); 
         String detailed = instruction.getString("detailed"); // get detailed string in instruction object 
         detailList.add(new Detail(journeyType, legType, instructionType, detailed)); 
        } 
       } 
      } 
     } 
     for(Detail detail : detailList) { 
      TextView textView = new TextView([yourContext]); 
      textView.setText(detail.detail); 
      yourContentViewGroup.addView(textView); 
      // or you can use View.inflate(context, layoutRes, yourContentViewGroup) and design a layout to show other detail instance values 
     } 
+0

Извините, я пропустил объект инструкции, я отредактировал ответ. –

+0

Спасибо! Не могли бы вы немного объяснить мне код? Я новичок! – envyM6

+0

Да, в основном после того, как вы получите массив путешествий, вы проходите его и проверяете каждый объект json, если в нем есть «ноги». Затем вы получаете массив ножек и пересекаете его в другом цикле и проверяете, есть ли у него «инструкция». Когда вы его находите, вы получаете объект инструкции и получаете детальную строку. OptString аналогична getString, за исключением того, что вы можете дать откат –