2015-10-29 5 views
0

Привет, ребята У меня проблема с разбором моего вложенного массива json. Это мой пример JSON ответ:Android parse inested json

{ 
    "SUCCESS": true, 
    "DATA": [ 
     { 
     "ShowData": [ 
      { 
      "ShowTitle": "Episode 1", 
      "Category": "Comedy" 
      }, 
      { 
      "ShowTitle": "Episode 1a", 
      "Category": "Drama" 
      }, 
      { 
      "ShowTitle": "Mr. Right", 
      "Category": "Musical" 
      }, 
      { 
      "ShowTitle": "The Making", 
      "Category": "Talk" 
      }, 
      { 
      "ShowTitle": "Presscon", 
      "Category": "Comedy" 
      }, 
      { 
      "ShowTitle": "Presscon 2", 
      "Category": "Drama" 
      }, 
      { 
      "ShowTitle": "Episode 2", 
      "Category": "Comedy" 
      }, 
      { 
      "ShowTitle": "Episode 2", 
      "Category": "Drama" 
      } 
     ] 
     } 
    ] 
    } 

Это то, что я пытался до сих пор:

активность:

ArrayList<HashMap<String, String>> showsList 
            = Parser.getShowsResponseBody(response); 

          ArrayList<HashMap<String, String>> result = new ArrayList<>(); 
          Set<String> titles = new HashSet<>(); 

          for(HashMap<String, String> map : showsList) { 
           if(titles.add(map.get("Category"))) { 
            result.add(map); 
           } 
          } 

Parser:

public static List<Show> getShowsResponseBody(Response response) { 
    BufferedReader reader = null; 
    StringBuilder sb = new StringBuilder(); 
    try { 
     reader = new BufferedReader(new InputStreamReader(response.getBody().in())); 
     String line; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    String result = sb.toString(); 

    List<WorldShow> list = new ArrayList<>(); 
    try { 
     JSONObject json = new JSONObject(result); 
     JSONArray jArray = json.getJSONArray("Data"); 
     for (int i = 0; i < jArray.length(); i++) { 
      JSONObject json_data = jArray.getJSONObject(i); 
      JSONArray arr = json_data.getJSONArray("ShowData"); 
      for(int j = 0; j < arr.length(); j++) { 
       JSONObject innerData = arr.getJSONObject(j); 

       Show show = new Show(); // Create Object here 

      show.setShowTitle(innerData.getString("ShowTitle")); 
      show.setCategory(innerData.getString("Category")); 
      list.add(show); // Finally adding the model to List 
      } 

     } 

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

    return list; 
} 

Мой ожидается выход:

Comedy: Episode 1, Presscon, Episode 2 
Drama: Episode 1a, Presscon 2, Episode 2 
Musical: Mr. Right 
Talk: The Making 

Но когда я запустить приложение, он показывает все записи всех категорий. Что, похоже, не так с моим кодом? Я уже использовал HashSet для удаления повторяющихся объектов, но он все тот же. Любая помощь будет с радостью оценена! Заранее спасибо!

+0

Вы, вероятно, хотите что-то вроде 'HashMap >' хранить несколько для каждой категории. – JimmyB

ответ

1
// Make a map to hold the mapping between categories and shows: 
// (A single category is mapped to a collection of 1 or more shows) 
Map<String,List<Show>> catShows = new HashMap<String,List<Show>>(); 

// Put a Show object into the category map for its matching category: 
private void addShow(Map<String,List<Show>> map, Show show) { 

    // Get the shows already stored under that category: 
    List<Show> list = map.get(show.getCategory()); 

    if (list == null) { 
    // There's no entry for that category yet, so we create a new (empty) list: 
    list = new ArrayList<Show>(); 

    // Store the new list for its category: 
    map.put(show.getCategory(), list); 
    } 

    // Add the given show to the list for its category: 
    list.add(show); 

} 

// Example for how to iterate over the map created above: 
private void process(Map<String,List<Show>> map) { 

    for (Map.Entry<String, List<Show>> e : map.entrySet()) { 

    final String category = e.getKey(); 

    final List<Show> shows = e.getValue(); 
    // Now we have in shows the list of all shows for the category. 

    System.out.println("Cat: " + category); 

    // Output all shows for the current category:  
    for (Show s : shows) { 
     System.out.println (s.getShowTitle()); 
    } 

    } 
} 
+0

Привет, спасибо, но могу ли я поместить это в мой класс Parser? –

+0

А также я не могу правильно отобразить его в своем адаптере. –

+0

Вы можете поместить его в любой класс, который вам подходит. Может захотеть создать для него выделенный класс. – JimmyB

1

Я думаю, вы можете изменить свой подход.

Я предлагаю вам использовать GSon Library и создать класс, который представляет ваш JSON:

Возможный сценарий:

Result.class

public class Result{ 
    boolean success; 
    List<Data> data; 

    //getter and setter 
} 

Data.class

public class Data{ 
List<Item> items;  

//getter and setter 
} 

Item.class

public class Item{ 
    String ShowTitle; 
    String Category; 

    //getter and setter 
} 

для разбора JSON:

Gson gson = new Gson(); 
Result result = gson.fromJson(json, Result.class); 

проверка this

+0

Неплохое предложение. Тем не менее, OP нуждается в некоторой степени, как 'class Category {String name; Коллекция показывает; } ', который структурно отличается от JSON, поэтому GSon & al. на самом деле не поможет. – JimmyB

+0

Привет, спасибо. Но я не обязан использовать сторонние библиотеки. –