Android parse nested json array(一对多关系)



嗨,伙计们,我在解析嵌套的 json 数组时遇到问题。这是我的示例 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);
                            }
                        }

解析 器:

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<Show> 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
        }
    }
}

我的预期输出是:

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

但是当我运行该应用程序时,它会显示所有类别中的所有记录。我的代码似乎有什么问题?我已经使用HashSet删除了重复的对象,但它仍然是一样的。任何帮助将不胜感激!提前感谢!

更新:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if(convertView == null) {
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_world_show_item, parent, false);
        viewHolder = new ViewHolder();
        viewHolder.tvShowName = (TextView) convertView.findViewById(R.id.tvShowName);
        viewHolder.btViewAllShows = (MyButton) convertView.findViewById(R.id.btViewAllShows);
        viewHolder.rvWorldShows = (RecyclerView) convertView.findViewById(R.id.rvWorldShows);
        viewHolder.llBackground = (LinearLayout) convertView.findViewById(R.id.llBackground);
        viewHolder.showsManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
        viewHolder.rvWorldShows.setLayoutManager(viewHolder.showsManager);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    if(position % 2 == 0) {
        viewHolder.llBackground.setBackgroundColor(context.getResources().getColor(R.color.main_blue_pressed));
    } else {
        viewHolder.llBackground.setBackgroundColor(context.getResources().getColor(R.color.main_blue));
    }
  viewHolder.tvShowName.setText(result.get(Constants.SHOW_CATEGORY));
    display(viewHolder.rvWorldShows, map, mList);
    return convertView;
}

更改以下代码:

  JSONObject json = new JSONObject(result);
    JSONArray jArray = json.getJSONArray("DATA");
    for (int i = 0; i < jArray.length(); i++) {
        JSONObject innerData = jArray .getJSONObject(i);
        JSONArray arr = json_data.getJSONArray("ShowData");
        for(int j = 0; j < arr.length(); j++) {
            JSONObject jbj= arr.getJSONObject(j);
            Show show = new Show(); // Create Object here
         show.setShowTitle(jbj.getString("ShowTitle"));
         show.setCategory(jbj.getString("Category"));
         list.add(show); // Finally adding the model to List
        }
}

快乐编码。

class MainClass{
    private boolean SUCESS;
    private List<MainClass> DATA;
    private List<SubClass> showData;
    private class SubClass{
        private String ShowTitle;
        private String Category
    }
}

使用 DTO 类,以便非常容易处理复杂的 JSON 对象。可以使用单行分析 json。

MainClass obj = new Gson().fromJson(result , MainClass.class);

根据响应,您将对类层次结构进行建模。

Class Response{
boolean Success;
 private List<DATA> dataList;
}
Class DATA{
 private List<ShowData> showDataList;
}
Class ShowDataList{
String ShowTitle;
String Category;
}

最新更新