嗨,伙计们,我在解析嵌套的 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;
}