我遇到了使用网络服务的问题,下面是服务的外观。
[
{"NND (Megastore \/ Supermarket)":
[
{"question":"\"33\" Export (Can)","questionid":"32"},
{"question":"Ace Roots (Can)","questionid":"33"},
{"question":"Amstel (Can)","questionid":"34"},
{"question":"Climax (Can)","questionid":"35"},
{"question":"Fayrouz (Cann)","questionid":"36"},
{"question":"Goldberg (RGB)","questionid":"37"},
{"question":"Gulder (Can)","questionid":"38"},
{"question":"Gulder (RGB)","questionid":"39"},
{"question":"Heineken (Can)","questionid":"40"},
{"question":"Heineken (RGB)","questionid":"41"},
{"question":"Legend (Can)","questionid":"42"},
{"question":"Maltina (Can)","questionid":"43"},
{"question":"Star (Can)","questionid":"44"},
{"question":"Star (RGB)","questionid":"45"},
{"question":"Star Radler (Can)","questionid":"46"},
{"question":"Strongbow (Can)","questionid":"47"}
]
},
{"NND (Superette - including returnable)":
[
{"question":"\"33\" Export (Can)","questionid":"48"},
{"question":"Ace Roots (Can)","questionid":"49"},
{"question":"Amstel (Can)","questionid":"50"},
{"question":"Climax (Can)","questionid":"51"},
{"question":"Fayrouz (Cann)","questionid":"52"},
{"question":"Goldberg (RGB)","questionid":"53"},
{"question":"Gulder (Can)","questionid":"54"},
{"question":"Gulder (RGB)","questionid":"55"},
{"question":"Heineken (Can)","questionid":"56"},
{"question":"Heineken (RGB)","questionid":"57"},
{"question":"Legend (Can)","questionid":"58"},
{"question":"Maltina (Can)","questionid":"59"},
{"question":"Star (Can)","questionid":"60"},
{"question":"Star (RGB)","questionid":"61"},
{"question":"Star Radler (Can)","questionid":"62"},
{"question":"Strongbow (Can)","questionid":"63"}
]
},
]
这是HEADER1的声明
private static final String HEADER1 = "NND (Megastore \\/ Supermarket)";
我在android中使用asynctask,下面是我的doInBackgroud代码的样子。
@Override
protected String doInBackground(String... strings) {
JSONParser jsonParser = new JSONParser();
listDataHeader = new ArrayList<>();
listDataChild = new HashMap<>();
//get JSON string from URL
JSONArray json = jsonParser.getMTOQuestions(mtoURL);
//JSONObject json = jsonParser.getMTOQuestions(mtoURL);
try{
//JSONObject c = json.getJSONObject(HEADER1);
//JSONArray jsonArray = json.getJSONArray(0);
for(int i =0; i<json.length(); i++){
//Log.e("INSIDE_MTO",""+c.getString(HEADER1));
//String question = c.getString(QUESTION);
JSONObject job = json.getJSONObject(i);
JSONArray header1 = job.getJSONArray(HEADER1);
listDataHeader.add(HEADER1);
Log.e("INSIDE_MTO",""+json);
for (int quest_in_headr = 0; quest_in_headr<header1.length(); quest_in_headr++){
JSONObject jsonHeader1 = header1.getJSONObject(quest_in_headr);
question = jsonHeader1.getString(QUESTION);
String qid = jsonHeader1.getString(QUESTION_ID);
//HashMap<String, String> forHeader1 = new HashMap<>();
List<String> forHeader1 = new ArrayList<>();
forHeader1.add(question.trim());
//Log.e("INSIDE_INNER_LOOP", question);
listDataChild.put(listDataHeader.get(0), forHeader1);
//Log.e("ADD_DATA",""+listDataHeader.add(HEADER1));
}
// map.put(QUESTION_ID, qid.trim());
}
}
catch (JSONException e){
e.printStackTrace();
}
finally {
}
return null;
}
以下是JSONParser代码的样子
public JSONArray getMTOQuestions(String url){
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try{
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200){
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null){
builder.append(line);
//Log.i("OutletList",line+"\n");
}
}
else {
Log.e("MTOQUESTION","Failed load MTO questionnaire");
}
}
catch (ClientProtocolException cpe){
cpe.printStackTrace();
}
catch (IOException ioexception){
ioexception.printStackTrace();
}
finally {
}
//try parse the JSON to an Object
try{
jarray = new JSONArray(builder.toString().trim());
}
catch (JSONException ex){ex.printStackTrace();}
//return the JSON string gotten
return jarray;
}
什么Log.e(“INSIDE_MTO”,“”+ json);返回是
[{"NND (Megastore \/ Supermarket)":[{"question":"\"33\" Export (Can)","questionid":"32"},{"question":"Ace Roots (Can)","questionid":"33"},{"question":"Amstel (Can)","questionid":"34"},{"question":"Climax (Can)","questionid":"35"},{"question":"Fayrouz (Cann)","questionid":"36"},{"question":"Goldberg (RGB)","questionid":"37"},{"question":"Gulder (Can)","questionid":"38"},{"question":"Gulder (RGB)","questionid":"39"},{"question":"Heineken (Can)","questionid":"40"},{"question":"Heineken (RGB)","questionid":"41"},{"question":"Legend (Can)","questionid":"42"},{"question":"Maltina (Can)","questionid":"43"},{"question":"Star (Can)","questionid":"44"},{"question":"Star (RGB)","questionid":"45"},{"question":"Star Radler (Can)","questionid":"46"},{"question":"Strongbow (Can)","questionid":"47"}]},{"NND (Superette - including returnable)":[{"question":"\"33\" Export (Can)","questionid":"48"},{"question":"Ace Roots (Can)","questionid":"49"},{"question":"Amstel (Can)","questionid":"50"},{"question":"Climax (Can)","questionid":"51"},{"question":"Fayrouz (Cann)","questionid":"52"},{"question":"Goldberg (RGB)","questionid":"53"},{"question":"Gulder (Can)","questionid":"54"},{"question":"Gulder (RGB)","questionid":"55"},{"question":"Heineken (Can)","questionid":"56"},{"question":"Heineken (RGB)","questionid":"57"},{"question":"Legend (Can)","questionid":"58"},{"question":"Maltina (Can)","questionid":"59"},{"question":"Star (Can)","questionid":"60"},{"question":"Star (RGB)","questionid":"61"},{"question":"Star Radler (Can)","questionid":"62"},{"question":"Strongbow (Can)","questionid":"63"}]}]
但我一直收到这个错误:
JsonException "org.json.JSONException: No value for NND (Megastore \/ Supermarket)"
并且错误指向这行代码
JSONArray header1 = job.getJSONArray(HEADER1);
我在线搜索并在Stackoverflow上看到类似的问题,但似乎我自己的情况有点不同。如果你能提供帮助,我将非常感谢你们。
感谢您的期待。
答案 0 :(得分:0)
{"NND (Superette - including returnable)":
的对象抛出异常。
具有HEADER1
值的正确键的第一个JSON对象不是问题。
您正在使用此代码解析第二个(及后续)JSON对象
for(int i =0; i<json.length(); i++){
JSONObject job = json.getJSONObject(i);
JSONArray header1 = job.getJSONArray(HEADER1); // Error when i >= 1
答案 1 :(得分:0)
这是更新的代码,它按预期工作。所以我做的是获取JSON,然后获取带有变量obj的键,然后遍历键以获取键内的数组。
JSONArray json = jsonParser.getMTOQuestions(mtoURL);
try {
//JSONObject c = json.getJSONObject(HEADER1);
//JSONArray jsonArray = json.getJSONArray(0);
for (int i = 0; i < json.length(); i++) {
//Log.e("INSIDE_MTO",""+c.getString(HEADER1));
//String question = c.getString(QUESTION);
JSONObject job = json.getJSONObject(i);
Iterator<?> keys = job.keys();
//int child = 0;
while (keys.hasNext()) {
String key = (String) keys.next();
try {
Log.e("INSIDE_MTO", "" + key);
listDataHeader.add(key);
JSONArray headers = job.getJSONArray(key);
List<String> questionList = new ArrayList<>();
for (int quest_in_headr = 0; quest_in_headr < headers.length(); quest_in_headr++) {
JSONObject jsonHeader1 = headers.getJSONObject(quest_in_headr);
question = jsonHeader1.getString(QUESTION);
qid = jsonHeader1.getString(QUESTION_ID);
questionList.add(question.trim());
//Log.e("INSIDE_INNER_LOOP", question + " " + qid);
//Log.e("ADD_DATA", "" + question);
}
listDataChild.put(listDataHeader.get(i), questionList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Log.e("VALUES_IN_QUESTANS", "" + questans);
} catch (JSONException e) {
e.printStackTrace();
}