【问题标题】:How to fetch and display data from local json file?如何从本地 json 文件中获取和显示数据?
【发布时间】:2014-07-31 06:51:33
【问题描述】:

how to fetch data from local json file?

根据上面的链接。我试图从存储在内部存储器中的 json 文件中获取数据。但我收到系统错误,从内部存储(json 文件)中获取数据。请帮忙。

               public class MainActivity extends Activity implements OnClickListener {
      private static final String TAG = "MainActivity";
       Button b1,b2;
        TextView t1;

    JSONArray jsonBranchArray;
        @Override
         public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    if (isNetworkAvailable()) {
        new PrefetchData().execute();
    } else { 
        Toast.makeText(MainActivity.this,
                "No Internet Connection Available", Toast.LENGTH_LONG)
                .show();
    }


    b1 = (Button) findViewById(R.id.button1);


    b1.setOnClickListener(this); 

             }

        @Override
        public void onClick(
                View v) {

            if (v == b1) {

                WriteToFile();
                readResponse();

            }
        }
        private boolean isNetworkAvailable() {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetworkInfo = connectivityManager
                    .getActiveNetworkInfo();
            if (activeNetworkInfo != null && activeNetworkInfo.isConnected())
            {
                return true;
            }
            return false;

        }

        private class PrefetchData extends AsyncTask<Void, Void, Void> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
            @Override
            protected Void doInBackground(Void... arg0) {

                AppUtils appUtils = new AppUtils();

                String jsonResultStr = appUtils
                        .getDataFromUrl("URL for json");


                Log.d(TAG, "JSON content  ::: "
                        + jsonResultStr);
                if (jsonResultStr != null) {

                    try {

                         JSONObject jsObj = new JSONObject(jsonResultStr);


                         jsonBranchArray = jsObj
                                .getJSONArray("ImageData");

                         Log.d(TAG, "JSONArray  content  ::: "
                                    + jsonBranchArray);

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

                            JSONObject objBranchJson = (JSONObject) jsonBranchArray
                                    .get(j);
                            img_id = objBranchJson.getString("ImageId");
                            img_name = objBranchJson.getString("ImageName");
                            img_desc = objBranchJson.getString("ImageDesc");
                            img_url = objBranchJson.getString("ImageUrl");

                        }
                    }

                    catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }

            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                Toast.makeText(MainActivity.this,
                        "Json values saved", Toast.LENGTH_LONG)
                        .show();
            }

        }

        @SuppressWarnings("deprecation")
        public void WriteToFile() {


            try { 

                 final String TESTSTRING =jsonBranchArray.toString();

                   FileOutputStream fOut = openFileOutput("samplefile.json",
                                                                        MODE_WORLD_READABLE);
                   OutputStreamWriter osw = new OutputStreamWriter(fOut); 

                   // Write the string to the file
                   osw.write(TESTSTRING);

                   /* ensure that everything is
                    * really written out and close */
                   osw.flush();
                   osw.close();

            //Reading the file back...

                   /* We have to use the openFileInput()-method
                    * the ActivityContext provides.
                    * Again for security reasons with
                    * openFileInput(...) */

                    FileInputStream fIn = openFileInput("samplefile.json");
                    InputStreamReader isr = new InputStreamReader(fIn);

                    /* Prepare a char-Array that will
                     * hold the chars we read back in. */
                    char[] inputBuffer = new char[TESTSTRING.length()];

                    // Fill the Buffer with data from the file
                    isr.read(inputBuffer);

                    // Transform the chars to a String
                    String readString = new String(inputBuffer);

                    // Check if we read back the same chars that we had written out
                    boolean isTheSame = TESTSTRING.equals(readString);

                    Log.i("File Reading stuff", "success = " + isTheSame);

                } catch (IOException ioe) 
                  {ioe.printStackTrace();}

        }

                               public JSONObject readResponse() {
               InputStream inputStream = null;
           try {
                  inputStream = this.openFileInput("samplefile.json");
               } catch (IOException e1) {
               e1.printStackTrace();
            }
              JSONObject jsonObject = null;
              if (inputStream != null) {
                      BufferedReader reader = new BufferedReader(new InputStreamReader(
            inputStream));
               StringBuffer buffer = new StringBuffer();
                  String statement;
               try {
               while ((statement = reader.readLine()) != null) {
            if (statement.trim().length() > 0) {
                buffer.append(statement);

                if (img_id=="12"){
                    System.out.println("ID can able to fetch using this method");
                    Log.i("File Reading stuff", "success");
                }
            }
                }
             } catch (IOException e1) { // TODO Auto-generated catch block
        e1.printStackTrace();
            }
             if (buffer.length() > 0) {
        try {
            jsonObject = new JSONObject(buffer.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
                  }
         }
          return (JSONObject) jsonObject; 
           }}

错误是..W/System.err(407): org.json.JSONException: Value [{"ImageDesc":"Img1 Img1Img1","ImageId":"12","ImageName":"Img1", "ImageUrl":"http://192.168.10.200/dinesh/images/pro1.jpg"},{"ImageDesc":"Img13 Img13 Img13Img13","ImageId":"13","ImageName":"Img13", "ImageUrl":"http://192.168.10.200/dinesh/images/pro2.jpg"},{"ImageDesc":"Img14 Img14 Img14 Img14 Img14","ImageId":"14","ImageName":"Img14 org.json.JSONArray 类型的 ","ImageUrl":"http://192.168.10.200/dinesh/images/pro3.jpg.jpg"},null] 无法转换为 JSONObject 07-31 11:57:11.804: W/System.err(407): 在 org.json.JSON.typeMismatch(JSON.java:107) 07-31 11:57:11.804: W/System.err(407): 在 org.json.JSONObject.(JSONObject.java:158) 07-31 11:57:11.804: W/System.err(407): 在 org.json.JSONObject.(JSONObject.java:171) 07-31 11:57:11.804: W/System.err(407): 在 com.example.MainActivity.readResponse(MainActivity.java:310) 07-31 11:57:11.814: W/System.err(407): 在 com.example.MainActivity.onClick(MainActivity.java:111) 07-31 11:57:11.814: W/System.err(407): 在 android.view.View.performClick(View.java:2485) 07-31 11:57:11.814: W/System.err(407): 在 android.view.View$PerformClick.run(View.java:9080) 07-31 11:57:11.814: W/System.err(407): 在 android.os.Handler.handleCallback(Handler.java:587) 07-31 11:57:11.824: W/System.err(407): 在 android.os.Handler.dispatchMessage(Handler.java:92) 07-31 11:57:11.824: W/System.err(407): 在 android.os.Looper.loop(Looper.java:123) 07-31 11:57:11.824: W/System.err(407): 在 android.app.ActivityThread.main(ActivityThread.java:3683) 07-31 11:57:11.824: W/System.err(407): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-31 11:57:11.834: W/System.err(407): 在 java.lang.reflect.Method.invoke(Method.java:507) 07-31 11:57:11.834: W/System.err(407): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 07-31 11:57:11.834: W/System.err(407): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 07-31 11:57:11.834: W/System.err(407): at dalvik.system.NativeStart.main(Native Method)

我需要从存储在内部存储中的 json 文件中获取数据并将其显示在列表视图中。请帮忙。

示例 JSON 文件是.. {"ImageData":[{"ImageId":"12","ImageName":"Img1","ImageDesc":"Img1 Img1Img1 ","ImageUrl":"img_url/pro1. jpg"},{"ImageId":"13","ImageName":"Img13","ImageDesc":"Img13 Img13 Img13Img13","ImageUrl":"img_url/pro2.jpg"},{"ImageId":" 14","ImageName":"Img14","ImageDesc":"Img14 Img14 Img14 Img14 Img14","ImageUrl":"img_url/pro3.jpg.jpg"},]}

【问题讨论】:

  • 当您尝试将 jsonarray 转换为 jsonobject 时发生此错误,您的文件包含您尝试转换为 jsonobject 的 jsonarray
  • 阅读错误信息。它清楚地说明了问题所在。
  • 但我的 json 文件仅以对象开头。请检查示例。
  • @Pramod Yadav 请检查整个代码 json 示例和错误。
  • @Marius 请检查整个代码 json 示例和错误。

标签: android json android-activity offline-caching


【解决方案1】:

试试这个,你应该可以让它工作。

                    try {
                        JSONObject jsonObject = new JSONObject(jsonstring);
                        Iterator keys = jsonObject.keys();
                        while(keys.hasNext()) {
                            Object next = keys.next();
                            String strKey = (String) next;
                            Object obj = jsonObject.get(strKey);
                            if(obj instanceof String) {
                               JSONObject jsonObject = new JSONObject((String)obj);
                               //do your stuff..
                            } else if(obj instanceof JSONObject) {
                               //do your stuff..
                               if(jsonObject.has("<KEY>")) {
                                  String value = jsonObject.getString("<KEY>"));
                               }
                            } else if(obj instanceof JSONArray) {
                                JSONArray jsonArray = (JSONArray) obj;
                                for(int j = 0; j < jsonArray.length(); j ++) {
                                    JSONObject jsonObject1 = jsonArray.getJSONObject(j);
                                    //do your stuff..
                                   if(jsonObject1.has("<KEY>")) {
                                      String value = jsonObject1.getString("<KEY>"));
                                   } .... and so on
                                }
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

【讨论】:

    【解决方案2】:

    这段代码在提供的示例 json 上运行良好:

    package com.so.test.java;
    
    import org.json.JSONArray;
    import org.json.JSONObject;
    /**
     * @author prashant
     *
     */
    public class JsonParser {
        /**
         * @param args
         */
        public static void main(String[] args) {
            String sampleJson = "{\"ImageData\":[{\"ImageId\":\"12\",\"ImageName\":\"Img1\",\"ImageDesc\":\"Img1 Img1Img1 \",\"ImageUrl\":\"img_url/pro1.jpg\"},{\"ImageId\":\"13\",\"ImageName\":\"Img13\",\"ImageDesc\":\"Img13 Img13 Img13Img13 \",\"ImageUrl\":\"img_url/pro2.jpg\"},{\"ImageId\":\"14\",\"ImageName\":\"Img14\",\"ImageDesc\":\"Img14 Img14 Img14 Img14 Img14 \",\"ImageUrl\":\"img_url/pro3.jpg.jpg\"}]}";
            try {
                JSONObject rootObj = new JSONObject(sampleJson);
                JSONArray imageDataArr = rootObj.getJSONArray("ImageData");
                System.out.println("JSONArray  content  ::: "+ rootObj.toString());
               for (int j = 0; j < imageDataArr.length(); j++) {
                   JSONObject imageDataObj = (JSONObject) imageDataArr.get(j);
                   System.out.println(imageDataObj.getString("ImageId") + " " + imageDataObj.getString("ImageName"));
               }
           }catch(Exception e){
               e.printStackTrace();
           }
        }
    }
    

    此代码产生输出

    JSONArray  content  ::: {"ImageData":[{"ImageId":"12","ImageName":"Img1","ImageUrl":"img_url/pro1.jpg","ImageDesc":"Img1 Img1Img1 "},{"ImageId":"13","ImageName":"Img13","ImageUrl":"img_url/pro2.jpg","ImageDesc":"Img13 Img13 Img13Img13 "},{"ImageId":"14","ImageName":"Img14","ImageUrl":"img_url/pro3.jpg.jpg","ImageDesc":"Img14 Img14 Img14 Img14 Img14 "}]}
    12 Img1
    13 Img13
    14 Img14
    

    您使用的是什么 json 库。我希望,这个

    http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm

    【讨论】:

    • 然后在这一行出错..jsonBranchArray = jsObj.getJSONArray("ImageData")
    • 请使用示例 json 发布错误。您应该遵循 json 的设计来使用 JsonObject 和 JsonArray。 “ImageData”应该是一个对象,所以尝试使用 JsonObject 而不是 JsonArray。
    • @Prashant 我添加了示例 json。请帮忙
    • 但我的 json 文件仅以对象开头。请检查样本
    • 更新了答案。如果您仍然遇到任何问题,请告诉我。
    猜你喜欢
    • 2014-09-19
    • 2020-03-24
    • 2022-01-06
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多