【问题标题】:JSON No Value For Exception Also how to retrieve values if column names are entered by userJSON No Value For Exception 如果用户输入列名,如何检索值
【发布时间】:2015-05-19 05:42:01
【问题描述】:

我刚开始在android平台上开发,目前正在做一个原型。

我正在做的是从在线数据库中检索数据 通过json,但列名由用户提供,即由用户提供应检索数据的列的信息 例如,在数据库中存在三列 - OptionA、OptionB、OPtionC,并且要检索其数据的列的名称由用户提供。

这是我发送 url 的 JSON 代码-

public JSONArray RetreiveData(String option,String vendorname,String company,String style,String chimcompany,String shape,String size,String type,String category)
{
    // URL for getting all customers



    try {
        url = "http://piyushsharma.byethost16.com/retreivedata.php?option="+option+"&vendorname="+vendorname+"&company="+URLEncoder.encode(company,"UTF-8")+"&style="+style+"&chimcompany="+chimcompany+"&shape="+shape+"&size="+size+"&type="+type+"&category="+URLEncoder.encode(category,"UTF-8");
        Log.e("url",url);
    } catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    // Get HttpResponse Object from url.
    // Get HttpEntity from Http Response Object

    HttpEntity httpEntity = null;

    try
    {

        DefaultHttpClient httpClient = new DefaultHttpClient();  // Default HttpClient
        HttpGet httpGet = new HttpGet(url);

        HttpResponse httpResponse = httpClient.execute(httpGet);

        httpEntity = httpResponse.getEntity();



    } catch (ClientProtocolException e) {

        // Signals error in http protocol
        e.printStackTrace();

        //Log Errors Here



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


    // Convert HttpEntity into JSON Array
    JSONArray jsonArray = null;

    if (httpEntity != null) {
        try {
            String entityResponse = EntityUtils.toString(httpEntity);

            Log.e("Entity Response  : ", entityResponse);

            jsonArray = new JSONArray(entityResponse);

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

    return jsonArray;


}

这是我用于检索数据的 Json 代码 -

          public void SaveData(JSONArray jsonArray)
        {
         JSONObject json = null;
         sizeofarray=jsonArray.length();


          for(int i=0; i<=sizeofarray;i++){


                try {
                    json = jsonArray.getJSONObject(i);

                          Parea=json.getString("area");
                          Pbaskets=json.getString(company);
                          Prizechim=json.getString("prize");
                          Psnf=json.getString(type);
                          Ptile=json.getString(size);


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

            }  


 }

变量公司、类型和大小由用户传递。 请告诉我是否可以传递变量而不是字符串。 然后存储这些值以便在 textview 中显示它们。

这是 JSon 响应 -

[{"area":"29"},{"maggpie":"7890"},{"prize":"10000"},{"vintage":"6890"},{"15X10":" 375"}]

这是显示的异常 -

03-16 18:28:07.638: W/System.err(3344): org.json.JSONException:

maggpie 没有价值

03-16 18:28:07.648: W/System.err(3344): 在 org.json.JSONObject.get(JSONObject.java:355) 03-16 18:28:07.688: W/System.err(3344): 在 org.json.JSONObject.getString(JSONObject.java:515) 03-16 18:28:07.688: W/System.err(3344): 在 com.example.projectkitchennbathroom.Estimate.SaveData(Estimate.java:107) 03-16 18:28:07.688: W/System.err(3344): 在 com.example.projectkitchennbathroom.Estimate$RetreiveData.onPostExecute(Estimate.java:140) 03-16 18:28:07.708: W/System.err(3344): 在 com.example.projectkitchennbathroom.Estimate$RetreiveData.onPostExecute(Estimate.java:1) 03-16 18:28:07.708: W/System.err(3344): 在 android.os.AsyncTask.finish(AsyncTask.java:632) 03-16 18:28:07.708: W/System.err(3344): 在 android.os.AsyncTask.access$600(AsyncTask.java:177) 03-16 18:28:07.708: W/System.err(3344): 在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 03-16 18:28:07.708: W/System.err(3344): 在 android.os.Handler.dispatchMessage(Handler.java:102) 03-16 18:28:07.708: W/System.err(3344): 在 android.os.Looper.loop(Looper.java:136) 03-16 18:28:07.708: W/System.err(3344): 在 android.app.ActivityThread.main(ActivityThread.java:5017) 03-16 18:28:07.718: W/System.err(3344): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-16 18:28:07.718: W/System.err(3344): 在 java.lang.reflect.Method.invoke(Method.java:515) 03-16 18:28:07.718: W/System.err(3344): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 03-16 18:28:07.718: W/System.err(3344): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 03-16 18:28:07.718: W/System.err(3344): 在 dalvik.system.NativeStart.main(Native Method) 03-16 18:28:07.718: W/System.err(3344): org.json.JSONException: 区域没有值

我不知道为什么它显示为 null,尽管值存在?

【问题讨论】:

  • 这里忘了说变量 company,type,size 是用户输入的列名。这里提供的输入是 company="maggpie",type="vintage" 和 size="15X10"。

标签: java android json android-intent android-asynctask


【解决方案1】:

用户输入与 JSON 数组中存储的内容不匹配。这可能是由于如何读取用户输入。您应该确认用户输入中没有隐藏字符。

System.out.println("company.length() = " + company.length());
System.out.println("company = :" + company + ":");

我看不出所提供的代码有什么问题。

【讨论】:

    【解决方案2】:

    json 响应是一组 json 对象,而不是一个 json 对象,

    [{"area":"29"},{"maggpie":"7890"},{"prize":"10000"},{"vintage":"6890"},{"15X10":"375"}]
    

    如果它是一个 Json 对象,它会是这种格式,

    {"area":"29","maggpie":"7890","prize":"10000","vintage":"6890","15X10":"375"}
    

    所以要修复异常,获取json数组

    JSONArray json = jsonArray.getJSONObject(i);
    
    JSONObject area    = json.getJSONObject(0);
    JSONObject company = json.getJSONObject(1);
    JSONObject prize   = json.getJSONObject(2);
    JSONObject type    = json.getJSONObject(3);
    JSONObject size    = json.getJSONObject(4);
    
    //* you can get variable key key for each one, but for your example
    Parea=area.getString("area");
    Pbaskets=company.getString("maggpie");
    Prizechim=prize.getString("prize");
    Psnf=type.getString("vintage");
    Ptile=size.getString("15X10");
    

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2016-01-04
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多