在尝试解析 JSON 数据 W/System.err 时出现此错误:org.json.JSONException:对客户没有价值

Posted

技术标签:

【中文标题】在尝试解析 JSON 数据 W/System.err 时出现此错误:org.json.JSONException:对客户没有价值【英文标题】:Getting this error whilt trying to parse JSON data W/System.err: org.json.JSONException: No value for customers 【发布时间】:2019-12-19 23:24:48 【问题描述】:

我正在尝试从我的 rest api 中检索客户对象。我使用spring data jpa生成了api。我已经使用 volley 从 api 中检索信息。我不知道我做错了什么。由于我是android新手,所以我没有太多想法。有人可以帮我从我的 Json api 解析客户对象吗?

我的 api 看起来像这样:


  "_embedded": 
    "customers": [
      
        "firstName": "Alexander",
        "lastName": "arnold",
        "email": "trentarnold@liverpool.com",
        "password": "cornertakenquickly",
        "_links": 
          "self": 
            "href": "http://localhost:8080/api/customers/1"
          ,
          "customer": 
            "href": "http://localhost:8080/api/customers/1"
          
        
      ,
      
        "firstName": "test",
        "lastName": "tester",
        "email": "dulalsujan911@gmail.com",
        "password": "12345678",
        "_links": 
          "self": 
            "href": "http://localhost:8080/api/customers/2"
          ,
          "customer": 
            "href": "http://localhost:8080/api/customers/2"
          
        
      
    ]
  ,
  "_links": 
    "self": 
      "href": "http://localhost:8080/api/customers?page,size,sort",
      "templated": true
    ,
    "profile": 
      "href": "http://localhost:8080/api/profile/customers"
    
  ,
  "page": 
    "size": 20,
    "totalElements": 2,
    "totalPages": 1,
    "number": 0
  

我的代码看起来像这样我正在使用 volley:

  // connects to the api and stores the retrived JSON values in the           respective list
public void connectToApi()
    // initialize lists
    emailList = new ArrayList<>();
    passwordList = new ArrayList<>();

    final String BASE_URL ="http://192.168.1.67:8080/api/customers";
   // final String BASE_URL ="http://10.0.2.2:8080/api/customers";

    // creating a request ques for HTTP request
    RequestQueue requestQueue = Volley.newRequestQueue(this);

    // Setting HTTP GET request to retrieve the data from the SERVER
    JsonObjectRequest objectRequest = new JsonObjectRequest(Request.Method.GET,BASE_URL
            ,null
            , new Response.Listener<JSONObject>() 
        @Override
        public void onResponse(JSONObject response) 

                try 
                    JSONArray jsonArray = response.getJSONArray("customers");
                    for(int i=0; i<jsonArray.length();i++)
                        JSONObject customer = jsonArray.getJSONObject(i);
                        emailList.add(customer.getString("email"));
                        passwordList.add(customer.getString("password"));
                    

                 catch (Exception e) 
                   e.printStackTrace();
                
        

         , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 
            Log.e("REST error",error.toString() );
        
    

    );

    requestQueue.add(objectRequest);


【问题讨论】:

如果你在 response.getJSONArray("customers"); 上停止调试器;行“响应”包含什么? 您能否调试并检查您是否收到响应或错误? ("_embedded":"customers":"firstName":"Alexander","lastName":"arnold","email") 这就是它所包含的内容 【参考方案1】:

这样做:

@Override
    public void onResponse(JSONObject response) 

            try 
               JSONObject json = new JSONObject(response); 
               JSONObject json_embedded = json.getJSONObject("_embedded");// need to access JSONObject("_embedded")
               JSONArray jsonArray = json_embedded.getJSONArray("customers"); // then get JSONARRAY
                for(int i=0; i<jsonArray.length();i++)
                    JSONObject customer = jsonArray.getJSONObject(i);
                    emailList.add(customer.getString("email"));
                    passwordList.add(customer.getString("password"));
                

             catch (Exception e) 
               e.printStackTrace();
            
    

注意:您的 json 数组 (customers) 在 _embedded 中,这就是为什么 它显示异常。

【讨论】:

【参考方案2】:

你需要先访问_embedded对象。

try 
    JSONObject embedded = response.getJSONObject("_embedded");
    JSONArray jsonArray = embedded.getJSONArray("customers");
    for(int i=0; i<jsonArray.length();i++)
        JSONObject customer = jsonArray.getJSONObject(i);
        emailList.add(customer.getString("email"));
        passwordList.add(customer.getString("password"));
    
 catch (Exception e) 
    e.printStackTrace();

【讨论】:

@javaNoob 接受答案,所以其他人不会尝试

以上是关于在尝试解析 JSON 数据 W/System.err 时出现此错误:org.json.JSONException:对客户没有价值的主要内容,如果未能解决你的问题,请参考以下文章

在尝试解析 JSON 数据 W/System.err 时出现此错误:org.json.JSONException:对客户没有价值

使用 Codable 解析嵌套的 JSON 数据

无法解析数据 JSON alamofire SwiftyJSON

解析 JSON 数据

数据表从解析的 json 更改文本颜色

快速解析 Json 数据