문제

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