2013-03-24 87 views
0

我想从json文件读取文件JSONObject内部有JSONArray,它正在读取第一个JSONObject值,但没有从里面读取数组称为“缩放”,你能帮我吗?Android阅读来自JSONObject的JSONArray

{ 
    "@file_name": "materials", 
    "materials": [ 
     { 
      "@site_name": "N/A", 
      "@site_icon_iPad_xPosition": "150", 
      "@site_icon_iPad_yPosition": "150", 
      "@site_icon_Android_xPosition": "215", 
      "@site_icon_Android_yPosition": "206", 
      "zoom": 
       { 
        "@zoom_name": "Main Reservoir", 
        "@zoom_number": "zoom1" 

       } 

     }, 
     { 
      "@site_name": "Building Applications", 
      "@site_icon_iPad_xPosition": "636", 
      "@site_icon_iPad_yPosition": "313", 
      "@site_icon_Android_xPosition": "215", 
      "@site_icon_Android_yPosition": "206", 
      "zoom": [ 
       { 
        "@zoom_name": "Rooftop Reservoir & Pump Station", 
        "@zoom_number": "zoom10-1" 

       }, 
       { 
        "@zoom_name": "Compact Zone PRV System", 
        "@zoom_number": "zoom10-2" 

       }, 
       { 
        "@zoom_name": "Basement Reservoir & Pump Room", 
        "@zoom_number": "zoom10-3" 

       } 
      ]   
     } 
    ] 
} 

我的代码:

JSONParser jParser = new JSONParser(); 
     JSONObject json = jParser.getJSONFromUrl(Environment.getExternalStorageDirectory().getPath()+"/Materials.json"); 

      try { 


       JSONArray materials = json.getJSONArray("materials"); 
       for(int i = 0; i < materials.length(); i++){ 

        JSONObject c = materials.getJSONObject(i); 

        // Storing each json item in variable 
        String a1= c.getString("@site_name"); 
        String a2 = c.getString("@site_icon_Android_xPosition"); 
        String a3 = c.getString("@site_icon_Android_yPosition"); 

        Log.d(TAG, a1+" "+a2+" "+a3); 


        JSONArray zoom = c.getJSONArray("zoom"); 
        Log.d(TAG, ""+zoom.length()); 
        for(int j = 0; j < zoom.length(); j++){ 

         JSONObject d = zoom.getJSONObject(j); 
         String b1 = d.getString("@zoom_name"); 
         String b2 = d.getString("@zoom_number"); 
         Log.d(TAG, b1+" "+b2); 
        } 

        Log.d(TAG, "--------------------------------"); 


       } 
      } catch (JSONException e) { 
       Log.d(TAG, "exeption"); 
       e.printStackTrace(); 
      } 

我的输出:

Applications 215 206 
exeption 

例外:

03-24 11:29:01.188: W/System.err(17952): org.json.JSONException: Value {"@zoom_number":"zoom1","@zoom_name":"Main Reservoir"} at zoom of type org.json.JSONObject cannot be converted to JSONArray 
03-24 11:29:01.198: W/System.err(17952): at org.json.JSON.typeMismatch(JSON.java:100) 
03-24 11:29:01.198: W/System.err(17952): at org.json.JSONObject.getJSONArray(JSONObject.java:548) 
03-24 11:29:01.198: W/System.err(17952): at com.weterworks.MainActivity.onCreate(MainActivity.java:120) 
03-24 11:29:01.198: W/System.err(17952): at android.app.Activity.performCreate(Activity.java:4465) 
03-24 11:29:01.198: W/System.err(17952): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-24 11:29:01.198: W/System.err(17952): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
03-24 11:29:01.198: W/System.err(17952): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
03-24 11:29:01.198: W/System.err(17952): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
03-24 11:29:01.198: W/System.err(17952): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
03-24 11:29:01.198: W/System.err(17952): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-24 11:29:01.198: W/System.err(17952): at android.os.Looper.loop(Looper.java:137) 
03-24 11:29:01.198: W/System.err(17952): at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-24 11:29:01.198: W/System.err(17952): at java.lang.reflect.Method.invokeNative(Native Method) 
03-24 11:29:01.198: W/System.err(17952): at java.lang.reflect.Method.invoke(Method.java:511) 
03-24 11:29:01.198: W/System.err(17952): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-24 11:29:01.198: W/System.err(17952): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-24 11:29:01.198: W/System.err(17952): at dalvik.system.NativeStart.main(Native Method) 

回答

3

你在你的代码的一个小错误。在处理zoom属性的内部循环中,您指的是错误的数组对象。

for (int j = 0; j < zoom.length(); j++) { 

    JSONObject d = materials.getJSONObject(j); // <-- Should refer to zoom, not materials 
    String b1 = d.getString("@zoom_name"); 
    String b2 = d.getString("@zoom_number"); 
    Log.d(TAG, b1 + " " + b2); 
} 
+0

Thanx,我改变了materials.getJSONObject(j)到zoom.getJSONObject(j)仍然没有工作,我得到了同样的错误。 – Dim 2013-03-24 08:38:02

+0

什么是异常堆栈跟踪?将其添加到您的问题。 – Perception 2013-03-24 08:40:46

+0

刚刚测试过这个解决方案修复了问题 – 2013-03-24 08:51:36