質問

I'm trying to parse a json file that I have in my raw folder, but seems that I have a issue that I cannot detect what's causing it. Here is the JSON I try to parse:

{
    "data":{
        "mainScreen":[
                      {"id":"1","name":"I fantasmi del\rprincipe","count":"3","type":"big","image":"EventImage1.png","smallCont":"Alla scoperta della vita segreta del Machiavelli ...","addi_info":{

                               "image":"image_ev1.png",
                               "content":"Un percorso alla scoperta di Niccolò Machiavelli, grande protagonista della vita politica, civile e artistica del Rinascimento italiano, attraverso i luoghi della sua vicenda pubblica e privata.",
                               "red_lable":"500 anni, una storia attuale.",
                      "tasks":[{"id":"1","title":"Faccia a faccia con machiavelli","subtitle":"I fantasmi de Niccolo","head":"\"Guardando verso Firenze: i tormenti di Niccolò\"","image":"bTappa1.png","imageLock":"tapa6Block.png","imageUnlock":"tapa6Pass.png","lock":"0","latitude":"47.020871","longitude":"28.721327","song":""},

                               {"id":"2","title":"Il galateo del principe","subtitle":"I fantasmi de Niccolo","head":"\"Guardando verso Firenze: i tormenti di Niccolò\"","image":"bTappa2.png","imageLock":"tapa6Block.png","imageUnlock":"tapa6Pass.png","lock":"1","latitude":"47.010871","longitude":"28.721327","song":"01De"},

                                         {"id":"3","title":"La vicenda dell’esilio","subtitle":"I fantasmi de Niccolo","head":"\"Guardando verso Firenze: i tormenti di Niccolò\"","image":"bTappa3.png","imageLock":"tapa6Block.png","imageUnlock":"tapa6Pass.png","lock":"1","latitude":"47.020871","longitude":"28.731327","song":"01De"},

                                         {"id":"4","title":"La giornata di niccolo’","subtitle":"I fantasmi de Niccolo","head":"\"Guardando verso Firenze: i tormenti di Niccolò\"","image":"bTappa4.png","imageLock":"tapa6Block.png","imageUnlock":"tapa6Pass.png","lock":"1","latitude":"47.000871","longitude":"28.701327","song":"01De"},

                                         {"id":"5","title":"A colloquio con gli antichi","subtitle":"I fantasmi de Niccolo","head":"\"Guardando verso Firenze: i tormenti di Niccolò\"","image":"bTappa5.png","imageLock":"tapa6Block.png","imageUnlock":"tapa6Pass.png","lock":"1","latitude":"47.000871","longitude":"28.731327","song":"01De"},

                                         {"id":"6","title":"I fantasmi di niccolo’","subtitle":"I fantasmi de Niccolo","head":"\"Guardando verso Firenze: i tormenti di Niccolò\"","image":"bTappa6.png","imageLock":"tapa6Block.png","imageUnlock":"tapa6Pass.png","lock":"1","latitude":"47.020871","longitude":"28.701327","song":"01De"}



                                ]


                            }}
]
}
}

And here is my code:

try {
                    // Get Data From Text Resource File Contains Json Data.
                    InputStream inputStream = getResources().openRawResource(
                            R.raw.fulldata);
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

                    int ctr;

                    ctr = inputStream.read();
                    while (ctr != -1) {
                        byteArrayOutputStream.write(ctr);
                        ctr = inputStream.read();
                    }
                    inputStream.close();

                    JSONObject jObject;

                    jObject = new JSONObject(byteArrayOutputStream.toString());

                    JSONObject jObjectResult = jObject.getJSONObject("data");
                    JSONArray jArray = jObjectResult.getJSONArray("mainScreen");
                    myTasks = new ArrayList<Tasks>();
                    mainObjs = new ArrayList<MainScreenObject>();
                    for (int i = 0; i < jArray.length(); i++) {
                        JSONArray tasks = jArray.getJSONObject(i).getJSONArray(
                                "tasks");
                        Log.v("--", tasks.length() + " tasks");
                        for (int j = 0; j < tasks.length(); j++) {
                            myTasks.add(new Tasks(tasks.getJSONObject(j)
                                    .getInt("id"), tasks.getJSONObject(j)
                                    .getInt("lock"), tasks.getJSONObject(j)
                                    .getDouble("longitude"), tasks
                                    .getJSONObject(j).getDouble("latitude"),
                                    tasks.getJSONObject(j).getString("title"),
                                    tasks.getJSONObject(j)
                                            .getString("subtitle"),
                                    tasks.getJSONObject(j).getString("head"),
                                    tasks.getJSONObject(j).getString("image"),
                                    tasks.getJSONObject(j).getString(
                                            "imageLock"), tasks
                                            .getJSONObject(j).getString(
                                                    "imageUnlock"), tasks
                                            .getJSONObject(j).getString("song")));
                        }
                        mainObjs.add(new MainScreenObject(jArray.getJSONObject(
                                i).getInt("id"), jArray.getJSONObject(i)
                                .getInt("count"), jArray.getJSONObject(i)
                                .getString("name"), jArray.getJSONObject(i)
                                .getString("image"), jArray.getJSONObject(i)
                                .getString("smallCont"), jArray
                                .getJSONObject(i).getString("addi_info"),
                                myTasks));
                        myTasks.clear();
                    }

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

.. And the error I'm getting:

03-25 13:06:28.318: W/System.err(20588): org.json.JSONException: No value for tasks
03-25 13:06:28.318: W/System.err(20588):    at org.json.JSONObject.get(JSONObject.java:354)
03-25 13:06:28.318: W/System.err(20588):    at org.json.JSONObject.getJSONArray(JSONObject.java:544)
03-25 13:06:28.318: W/System.err(20588):    at com.scsp.Splash$1.run(Splash.java:64)

Anyone have an idea what is causing this?

役に立ちましたか?

解決

Simply change this.

 jObject = new JSONObject(byteArrayOutputStream.toString());

 JSONObject jObjectResult = jObject.getJSONObject("data");
 JSONArray jArray = jObjectResult.getJSONArray("mainScreen");
 myTasks = new ArrayList<Tasks>();
 mainObjs = new ArrayList<MainScreenObject>();
 for (int i = 0; i < jArray.length(); i++) {

  JSONObject jobj = jArray.getJSONObject(i)
  JSONObject jAddi= jobj.getJSONObject("addi_info");
  JSONArray tasks = jAddi.getJSONArray("tasks");

Your addi_info object is inside your tasks JSONArray. And you didn't see that. You have fetch wrong. So you didn't get. Also check proper json data see this

他のヒント

Try this..

tasks JSONArray is inside addi_info JSONObject thats you have missed

for (int i = 0; i < jArray.length(); i++) {
      JSONObject obj = jArray.getJSONObject(i)
      JSONObject jObsult = obj.getJSONObject("addi_info");
      JSONArray tasks = jObsult.getJSONArray("tasks");
      .
      .
      .

Try That:

jObject = new JSONObject(byteArrayOutputStream.toString());

     JSONObject jObjectResult = jObject.getJSONObject("data");
     JSONArray jArray = jObjectResult.getJSONArray("mainScreen");
     myTasks = new ArrayList<Tasks>();
     mainObjs = new ArrayList<MainScreenObject>();
     for (int i = 0; i < jArray.length(); i++) {

      JSONObject jobj = jArray.getJSONObject(i);
      JSONObject jAddi= jobj.getJSONObject("addi_info");
      JSONArray tasks = jAddi.getJSONArray("tasks");
    for (int j = 0; j < tasks.length(); j++) {
                                myTasks.add(new Tasks(tasks.getJSONObject(j)
                                        .getInt("id"), tasks.getJSONObject(j)
                                        .getInt("lock"), tasks.getJSONObject(j)
                                        .getDouble("longitude"), tasks
                                        .getJSONObject(j).getDouble("latitude"),
                                        tasks.getJSONObject(j).getString("title"),
                                        tasks.getJSONObject(j)
                                                .getString("subtitle"),
                                        tasks.getJSONObject(j).getString("head"),
                                        tasks.getJSONObject(j).getString("image"),
                                        tasks.getJSONObject(j).getString(
                                                "imageLock"), tasks
                                                .getJSONObject(j).getString(
                                                        "imageUnlock"), tasks
                                                .getJSONObject(j).getString("song")));
                            }
                            mainObjs.add(new MainScreenObject(jArray.getJSONObject(
                                    i).getInt("id"), jArray.getJSONObject(i)
                                    .getInt("count"), jArray.getJSONObject(i)
                                    .getString("name"), jArray.getJSONObject(i)
                                    .getString("image"), jArray.getJSONObject(i)
                                    .getString("smallCont"), jArray
                                    .getJSONObject(i).getString("addi_info"),
                                    myTasks));
                            myTasks.clear();
                        }

"{" presents json object values and "[" presents json array values.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top