【问题标题】:Json Parsing from Url In Android , Not working在Android中从Url解析Json,不工作
【发布时间】:2016-03-17 09:44:44
【问题描述】:

我正在从 URL 解析数据,下面提到的错误。

原始数据从服务器完美显示。无法使用 Json 解析拆分数据

请帮我解决这个错误

编辑:1

来自 URL 的 JSON 响应

[
    {
        "ID": 4,
        "Name": "Vinoth",
        "Contact": "1111111111",
        "Msg": "1"
    },
    {
        "ID": 5,
        "Name": "Mani",
        "Contact": "22222222",
        "Msg": "1"
    },
    {
        "ID": 6,
        "Name": "Manoj",
        "Contact": "33333333333",
        "Msg": "1"
    }
]

错误:

org.json.JSONException: Value [{"ID":1,"Name":"Lalita","Contact":"9997162499","Msg":"1"},{"ID":2,"Name":"kumar","Contact":"123456789","Msg":"1"}] of type java.lang.String cannot be converted to JSONArray
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:96)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:108)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at com.knowledgeflex.restapidemo.MainActivity$LoadService.onPostExecute(MainActivity.java:135)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at com.knowledgeflex.restapidemo.MainActivity$LoadService.onPostExecute(MainActivity.java:58)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:632)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at android.os.AsyncTask.access$600(AsyncTask.java:177)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at android.os.Looper.loop(Looper.java:136)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5584)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
12-11 18:23:27.249 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
12-11 18:23:27.259 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
12-11 18:23:27.259 30195-30195/com.knowledgeflex.restapidemo W/System.err:     at dalvik.system.NativeStart.main(Native Method)

MainActivity.java

public class MainActivity extends Activity {

    TextView name1,email,status,face;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button GetServerData = (Button) findViewById(R.id.button1);


      name1 = (TextView)findViewById(R.id.sname);
       email = (TextView)findViewById(R.id.email);
         status = (TextView)findViewById(R.id.status);
       face = (TextView)findViewById(R.id.fb);

        GetServerData.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                // Server Request URL
                String serverURL = "http://webapp/api/values";

                // Create Object and call AsyncTask execute Method
                new LoadService().execute(serverURL);

            }
        });

    }


    // Class with extends AsyncTask class
    private class LoadService extends AsyncTask<String, Void, Void> {

        private final HttpClient Client = new DefaultHttpClient();
        private String Content;
        private String Error = null;
        private final String TAG = null;
        String name = null;
        private ProgressDialog Dialog = new ProgressDialog(MainActivity.this);

        TextView uiUpdate = (TextView) findViewById(R.id.textView2);

        protected void onPreExecute() {
            // NOTE: You can call UI Element here.

            // UI Element
            uiUpdate.setText("");
            Dialog.setMessage("Loading service..");
            Dialog.show();
        }

        // Call after onPreExecute method
        protected Void doInBackground(String... urls) {
            try {

                // NOTE: Don't call UI Element here.

                HttpGet httpget = new HttpGet(urls[0]);
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                Content = Client.execute(httpget, responseHandler);

            } catch (ClientProtocolException e) {
                Error = e.getMessage();
                cancel(true);
            } catch (IOException e) {
                Error = e.getMessage();
                cancel(true);
            }

            return null;
        }

        protected void onPostExecute(Void unused) {
            // Close progress dialog
            Dialog.dismiss();
            Log.e(TAG, "------------------------------------- Output: " + Content);


            try {
                JSONArray jArr=new JSONArray(Content);
                for(int i=0;i<jArr.length();i++) {
                    JSONObject json=jArr.getJSONObject(i);


                    name1.setText(json.getString("Name"));
                    email.setText(json.getString("ID"));
                    status.setText(json.getString("Contact"));
                    face.setText(json.getString("Msg"));

                }

            } catch (JSONException e) {
                e.printStackTrace();
                Log.i("EXCEPTION   ","");
            }

            uiUpdate.setText("Raw Output : " + Content);
        }



    }


}

【问题讨论】:

  • 您将返回 JSONArray 更改为返回 JSONObject 我认为可以解决您的问题
  • 建议不要自己解析。尝试使用Gson 更轻松地解析您的 JSON。
  • 所以这段代码行不通?
  • 我的 json 响应没有任何 Json 数组名称,该怎么办?

标签: android json parsing


【解决方案1】:

根据您的回复,JSONArray 和 gson 库在 json 数据解析时更好用,因此请使用下面的类来处理任何类型的数据

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;


public class ApiData {
    @SerializedName("data")
    @Expose
    private JsonArray Data;

    public <T> List<T> getData(Class<T> c) {
        Type type = new ListParams(c);
        return new Gson().fromJson(Data, type);
    }

    private class ListParams implements ParameterizedType {

        private Type type;

        private ListParams(Type type) {
            this.type = type;
        }

        @Override
        public Type[] getActualTypeArguments() {
            return new Type[]{type};
        }

        @Override
        public Type getRawType() {
            return ArrayList.class;
        }

        @Override
        public Type getOwnerType() {
            return null;
        }


        @Override
        public boolean equals(Object o) {
            return super.equals(o);
        }

    }
}

创建模型类,如:

public class Model{
   String ID;
   String Name;
   String Contact;
   String msg;
}

现在像这样解析你的数据:

ApiData apiData = new Gson().fromJson(Content, ApiData.class);
Lis<Model> models = apiData.getData(Model.class); 

【讨论】:

  • 如果您遇到任何问题或需要解释,请告诉我
【解决方案2】:
 try {
                Object jsonObject = new JSONTokener(Content).nextValue();
                JSONArray jArr=new JSONArray(jsonObject );
                for(int i=0;i<jArr.length();i++) {
                    JSONObject json=jArr.getJSONObject(i);
                    name1.setText(json.getString("Name"));
                    email.setText(json.getString("ID"));
                    status.setText(json.getString("Contact"));
                    face.setText(json.getString("Msg"));

                }

            } catch (JSONException e) {
                e.printStackTrace();
                Log.i("EXCEPTION   ","");
            }

你不能直接将字符串应用到数组,你应该将字符串转换为jsonobject,然后你可以做对象到数组。 希望你能理解

【讨论】:

  • 还有问题,请随时告诉我
  • 你能发布堆栈跟踪吗?
  • 我试过你的代码还是一样。我在哪里犯错了?
  • java.lang.String 类型的无法转换为 JSONObject
  • 之前显示的错误为 java.lang.String 无法转换为 JSONArray 。现在它的 Showing java.lang.String 无法转换为 JSONObject。
【解决方案3】:

因为我在这里添加了转义到你的 json 只是为了临时存储它:

请检查下面的解析代码,它对我有用:

String response = "[\r\n    {\r\n        \"ID\": 4,\r\n        \"Name\": \"Vinoth\",\r\n        \"Contact\": \"1111111111\",\r\n        \"Msg\": \"1\"\r\n    },\r\n    {\r\n        \"ID\": 5,\r\n        \"Name\": \"Mani\",\r\n        \"Contact\": \"22222222\",\r\n        \"Msg\": \"1\"\r\n    },\r\n    {\r\n        \"ID\": 6,\r\n        \"Name\": \"Manoj\",\r\n        \"Contact\": \"33333333333\",\r\n        \"Msg\": \"1\"\r\n    }\r\n]";
        try {
            JSONArray jsonArray = new JSONArray(response); // replace response with your response string
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Log.e("ID", jsonObject.getInt("ID") + "");
                Log.e("Name", jsonObject.getString("Name"));
                Log.e("Contact", jsonObject.getString("Contact"));
                Log.e("Msg", jsonObject.getString("Msg"));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

我打印的日志:

12-17 15:42:54.459 9064-9064/com.example.testapplication E/ID: 4 12-17 15:42:54.459 9064-9064/com.example.testapplication E/名称:Vinoth 12-17 15:42:54.459 9064-9064/com.example.testapplication E/联系方式: 1111111111 12-17 15:42:54.459 9064-9064/com.example.testapplication 电子邮件:1 12-17 15:42:54.459 9064-9064/com.example.testapplication E/ID: 5 12-17 15:42:54.459 9064-9064/com.example.testapplication 电子/姓名:Mani 12-17 15:42:54.459 9064-9064/com.example.testapplication 电子/联系人:22222222 12-17 15:42:54.459 9064-9064/com.example.testapplication E/Msg: 1 12-17 15:42:54.459 9064-9064/com.example.testapplication E/ID: 6 12-17 15:42:54.459 9064-9064/com.example.testapplication E/姓名:Manoj 12-17 15:42:54.459 9064-9064/com.example.testapplication E/联系方式:33333333333 12-17 15:42:54.459 9064-9064/com.example.testapplication E/Msg: 1

谢谢..!

【讨论】:

  • 再次出错 org.json.JSONException: Value [{"ID":1,"Name":"Lalita","Contact":"9997162499","Msg":"1"}, {"ID":2,"Name":"kumar","Contact":"123456789","Msg":"1"}] java.lang.String 类型无法转换为 JSONArray 发生错误
  • 我的回复是“仅内容”,如何添加间距。
  • @Kumar :您不需要添加任何间距,例如我添加了escaping 并且您的代码在我的机器上运行良好..!!
【解决方案4】:

public JSONArray (String json) 的文档说它抛出了一个

如果解析失败或未产生 JSONArray,则出现 JSONException。

也许他无法处理你的回复,这很有趣,因为一个简单的在线 json 解析器可以:http://json.parser.online.fr/

正如之前评论中提到的用户“Jelle van Es”,我会尝试使用 Gson 来完成这项工作。 (我会在他的评论下发表评论,但我的声誉很少xD)

【讨论】:

    【解决方案5】:

    您在“ID”上使用了getString,而您应该使用getInt。我测试了您在问题中提供的 JSON 字符串。以下代码有效:

    String json =
        "[{\"ID\":4,\"Name\":\"Vinoth\",\"Contact\":\"1111111111\",\"Msg\":\"1\"},{\"ID\":5,\"Name\":\"Mani\",\"Contact\":\"22222222\",\"Msg\":\"1\"},{\"ID\":6,\"Name\":\"Manoj\",\"Contact\":\"33333333333\",\"Msg\":\"1\"}]";
    try {
      JSONArray jsonArray = new JSONArray(json);
      for (int i = 0, len = jsonArray.length(); i < len; i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        int id = jsonObject.getInt("ID");
        String name = jsonObject.getString("Name");
        String contact = jsonObject.getString("Contact");
        String msg = jsonObject.getString("Msg");
        System.out.println("id=" + id + ", name='" + name + "\', contact='" + contact + "\', msg='" + msg);
      }
    } catch (JSONException e) {
      e.printStackTrace();
    }
    

    运行上述代码的输出:

    id=4,name='Vinoth',contact='1111111111',msg='1

    id=5,name='Mani',contact='22222222',msg='1

    id=6,name='Manoj',contact='33333333333',msg='1

    如果您仍然收到错误,请发布堆栈跟踪。

    【讨论】:

    • org.json.JSONException: 值 [{"ID":1,"Name":"Lalita","Contact":"9997162499","Msg":"1"},{" ID":2,"Name":"kumar","Contact":"123456789","Msg":"1"},{"ID":3,"Name":"Swatantra","Contact":" 987654321","Msg":"1"},{"ID":4,"Name":"Vinoth","Contact":"1111111111","Msg":"1"},{"ID":5 ,"姓名":"Manish","联系人":"22222222","消息":"1"},{"ID":6,"姓名":"Manoj","联系人":"33333333333"," java.lang 类型的 Msg":"1"},{"ID":7,"Name":"This Url Connected With Azure Database","Contact":"11111","Msg":"1"}] .String 无法在 org.json.JSON.typeMismatch(JSON.java:111) 处转换​​为 JSONArray
    • 同样的错误,我得到原始字符串输出。但无法解析该值。
    • 在两个 Kitkat 设备中测试。但仍然是同样的错误。
    【解决方案6】:

    查看此链接JSONArray

    您不应该直接使用点击网络服务后得到的响应。首先将其转换为链接中给出的字符串,并在解析 id 时使用 getInt()

    【讨论】:

      【解决方案7】:

      您可以像下面这样解析您的 JSON。

                          try {
                                  JSONArray _jArray = new JSONArray("YOUR_RESPONSE");
                                  if (_jArray.length()>0){
                                      for (int i = 0 ; i < _jArray.length();i++){
                                          JSONObject _jSObject = _jArray.getJSONObject(i);
                                          int ID = _jSObject.getInt("ID");
                                          String Name = _jSObject.getString("Name");
                                          String Contact = _jSObject.getString("Contact");
                                          String Msg = _jSObject.getString("Msg");
                                          System.out.println("Id : " + ID);
                                          System.out.println("Name : " + Name);
                                          System.out.println("Contact : " + Contact);
                                          System.out.println("Msg : " + Msg);
                                      }
                                  }
                              } catch (Exception e) {
                                  e.printStackTrace();
                              }
      

      【讨论】:

      • 还是一样的异常。添加后:(
      • 我正在使用字符串响应,在 json 数组中传递。但仍然是同样的错误。
      • 您需要 getJSONfromURL() 方法返回 JSONArray,而不是 JSONObject。
      • 你应该让他们知道当前系统的缺陷是什么,然后提供你的答案
      • 你能给我建议任何其他的解决方案吗?
      【解决方案8】:
      Best way and very fast parsing of JSON is GSON liabrary 
      
      dependacy for android studio compile 'com.google.code.gson:gson:2.3.1' OR you can download jar.
      
      Make DTO names of all strings exactly same json of resonse.
      
      
      Class ClassDTO{
          String ID;
          String Name;
          String Contact;
          String Msg;
      
          take gettters & setters
      
      }
      
      Just include this lines in your code.
      
      
      JSONArray array=new JSONArray(Content);
      if (array.length() > 0) {
          Gson gson = new Gson();
          int i = 0;
          while (i < array.length()) {
              list.add(gson.fromJson(array.getJSONObject(i).toString(), ClassDTO.class));
              i++;
          }    
      } else {
          Toast.makeText(JobCardActivity.this, "No response from server", Toast.LENGTH_LONG).show();
      }
      

      【讨论】:

        【解决方案9】:

        对于我使用这种方式的 json url 命中和数据解析 首先我为异步请求创建了一个类

            public class AsyncRequestForActivities extends
            AsyncTask<String, Integer, String> {
        
        OnAsyncRequestComplete caller;
        Context context;
        
        String method = "POST";
        List<NameValuePair> parameters = null;
        ProgressDialog pDialog = null;
        String Progress_msg;
        
        // Three Constructors
        public AsyncRequestForActivities(Context a, String m, String Msg,
                List<NameValuePair> p) {
            caller = (OnAsyncRequestComplete) a;
            context = a;
            method = m;
            parameters = p;
            Progress_msg = Msg;
        }
        
        public AsyncRequestForActivities(Context a, String m) {
            caller = (OnAsyncRequestComplete) a;
            context = a;
            method = m;
        
        }
        
        public AsyncRequestForActivities(Context a) {
            caller = (OnAsyncRequestComplete) a;
            context = a;
        }
        
        // Interface to be implemented by calling activity
        public interface OnAsyncRequestComplete {
            public void asyncResponse(String response);
        }
        
        public String doInBackground(String... urls) {
            // get url pointing to entry point of API
            String address = urls[0].toString();
            if (method == "POST") {
                return post(address);
            }
        
            if (method == "GET") {
                return get(address);
            }
        
            return null;
        
        }
        
        public void onPreExecute() {
        
            pDialog = new ProgressDialog(context);
            pDialog.setMessage(Progress_msg); // typically you will
            pDialog.setCancelable(false); // define such
            // strings in a remote file.
            pDialog.show();
        
        }
        
        public void onProgressUpdate(Integer... progress) {
            // you can implement some progressBar and update it in this record
            // setProgressPercent(progress[0]);
        }
        
        public void onPostExecute(String response) {
        
            if (pDialog != null && pDialog.isShowing()) {
                pDialog.dismiss();
            }
        
            caller.asyncResponse(response);
        }
        
        protected void onCancelled(String response) {
        
            if (pDialog != null && pDialog.isShowing()) {
                pDialog.dismiss();
            }
            caller.asyncResponse(response);
        }
        
        @SuppressWarnings("deprecation")
        private String get(String address) {
            try {
        
                if (parameters != null) {
        
                    String query = "";
                    String EQ = "=";
                    String AMP = "&";
                    for (NameValuePair param : parameters) {
                        query += param.getName() + EQ
                                + URLEncoder.encode(param.getValue()) + AMP;
                    }
        
                    if (query != "") {
                        address += "?" + query;
                    }
                }
        
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(address);
                HttpResponse response = client.execute(get);
        
                return stringifyResponse(response);
        
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
            }
        
            return null;
        }
        
        private String post(String address) {
            try {
        
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(address);
        
                if (parameters != null) {
                    post.setEntity(new UrlEncodedFormEntity(parameters));
                }
        
                HttpResponse response = client.execute(post);
                return stringifyResponse(response);
        
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
            }
        
            return null;
        }
        
        private String stringifyResponse(HttpResponse response) {
            BufferedReader in;
        
            try {
                in = new BufferedReader(new InputStreamReader(response.getEntity()
                        .getContent()));
        
                StringBuffer sb = new StringBuffer("");
                String line = "";
                while ((line = in.readLine()) != null) {
                    sb.append(line);
                }
                in.close();
        
                return sb.toString();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        

        }

        现在,当您想要获取数据时,您必须在活动中实现接口

            public class SomeClass extends Activity implements OnAsyncRequestComplete{
            // your activity code here
        
           // some where in class in any function you want
            AsyncRequestForActivities req=new AsyncRequestForActivities(SomeClass.this, MethodType, YourMessage,
                Perameters_in_List<NameValuePareType>);
        
        
            req.execute(YourURL);
        
            }//end of that function
            @Override
            public void asyncResponse(String response) {
        
            try {
        
                if (!(response == null)) {
                      JSONArray jArray = new JSONArray("response");
                                if (jArray.length()>0){
                                    for (int i = 0 ; i < jArray.length();i++){
                                        JSONObject jSObject = jArray.getJSONObject(i);
                                        int ID = _jSObject.getInt("ID");
                                        String Name = _jSObject.getString("Name");
                                        String Contact = jSObject.getString("Contact");
                                        String Msg = jSObject.getString("Msg");
                                        System.out.println("Id : " + ID);
                                        System.out.println("Name : " + Name);
                                        System.out.println("Contact : " + Contact);
                                        System.out.println("Msg : " + Msg);
                                    }
        
        
                }
        
            } catch (JSONException e) {
                e.printStackTrace();
            }
            }
            }
        

        【讨论】:

        • 如果问题仍然存在,那么首先将响应作为 JSON 对象获取,例如: JSONObject postObject = new JSONObject(response);然后从这个对象中获取数组:希望你会发现你的解决方案消失了
        猜你喜欢
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多