2017-09-23 65 views
0

所以我无法读取android volley中onResponse方法给出的JSON数据,这是我的GET代码。如何解析另一个JSONObject内的JSONObject,使用Android Volley进行HTTP连接

private void GetSV(){ 
    final String getURL = "my URL"; 

    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, getURL, null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
       Iterator keys = response.keys(); 
       while (keys.hasNext()){ 
        Object key = keys.hasNext(); 
        switch (key.toString()){ 
         case "statusCode": 
          statusCode = getValue(response, "statusCode"); 
          break; 
         default: 
          break; 
        } 
        try { 
        JSONObject data = response.getJSONObject("data"); 
        Iterator innerKeys = data.keys(); 
        while (innerKeys.hasNext()){ 
         Object innerKey = innerKeys.hasNext(); 
         switch (innerKey.toString()){ 
          case "Id": 
           User.setId(getValue(response, "Id")); 
           break; 
          case "firstName": 
           User.setFirstName(getValue(response, "firstName")); 
           break; 
          case "lastName": 
           User.setLastName(getValue(response, "lastName")); 
           User.setName(User.getFirstName() + " " + User.getLastName()); 
           name.setText(User.getName()); 
           break; 
          case "email": 
           User.setEmail(getValue(response, "email")); 
           break; 
          case "school": 
           User.setCollege(getValue(response, "school")); 
           college.setText(User.getCollege()); 
           break; 
          case "fact": 
           User.setRandom_fact(getValue(response, "fact")); 
           random_fact.setText(User.getRandom_fact()); 
           break; 
          case "age": 
           User.setAge(getValue(response, "age")); 
           age.setText(User.getAge()); 
           break; 
          case "major": 
           User.setMajor(getValue(response, "major")); 
           major.setText(User.getMajor()); 
           break; 
          default: 
           break; 
         } 
        } 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
}}, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<>(); 
      return params; 
     } 
    }; 
    RequestQueue requestQueue = Volley.newRequestQueue(context); 
    requestQueue.add(getRequest); 
} 

这是JSONObject结构在服务器上的样子,这是我想要获取和存储的信息。

{"statusCode":"200","message":"User was found.","data":{"Id":"[email protected]","firstName":"Blah","lastName":"Blah","email":"[email protected]","school":"FSU","fact":"","gender":"male","age":"22","major":"Business Marketing","createdAt":"2017-09-21T22:01:33.000Z","updatedAt":"2017-09-22T18:33:28.000Z"}} 

我得到了状态码,但我没有收到任何其他字段。这是在另一个JSON解析中执行JSON解析的正确方法吗?如果是的话,这是否是最理想的方式?

回答

0

你可以利用这个源

requestQueue = Volley.newRequestQueue(this); 

    JsonObjectRequest obreq = new JsonObjectRequest(Request.Method.GET, JsonURL, 
      // The third parameter Listener overrides the method onResponse() and passes 
      //JSONObject as a parameter 
      new Response.Listener<JSONObject>() { 

       // Takes the response from the JSON request 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         if(response.getString("statusCode").equeal("200")) { 
          User user = new User(); 

          JSONObject obj = response.getJSONObject("data"); 

          user.setId(obj.getString("Id")); 
          user.setFirstName(obj.getString("firstName")); 
          user.setLastName(obj.getString("lastName")); 
          user.setName(obj.getString("firstName")+" "+obj.getString("lastName")); 
          user.setEmail(obj.getString("email")); 
          user.setCollege(obj.getString("school")); 
          user.setRandom_fact(obj.getString("fact")); 
          user.setAge(obj.getString("age")); 
          user.setMajor(obj.getString("major")); 

          name.setText(user.getName()); 
          User.setEmail(user.getEmail()); 
          college.setText(user.getCollege()); 
          random_fact.setText(user.getRandom_fact()); 
          age.setText(user.getAge()); 
          major.setText(user.getMajor()); 
         } 


        } 
        // Try and catch are included to handle any errors due to JSON 
        catch (JSONException e) { 
         // If an error occurs, this prints the error to the log 
         e.printStackTrace(); 
        } 
       } 
      }, 
      // The final parameter overrides the method onErrorResponse() and passes VolleyError 
      //as a parameter 
      new Response.ErrorListener() { 
       @Override 
       // Handles errors that occur due to Volley 
       public void onErrorResponse(VolleyError error) { 
        Log.e("Volley", "Error"); 
       } 
      } 
    ); 
    // Adds the JSON object request "obreq" to the request queue 
    requestQueue.add(obreq); 
} 
0

使用

Iterator<String> keys = response.keys(); 

insteadof 

Iterator keys = response.keys(); 

switch (keys.next().toString()) 

insteadof 

Object key = keys.hasNext(); 
       switch (key.toString()) 

try { 
    Iterator<String> keys = response.keys(); 
    while (keys.hasNext()) { 
     switch (keys.next().toString()) { 
      case "statusCode": 

        Toast.makeText(this, "" + response.getString("statusCode"), Toast 
         .LENGTH_SHORT).show(); 

       break; 
      default: 
       break; 
     } 
     JSONObject data = response.getJSONObject("data"); 
     Iterator<String> innerKeys = data.keys(); 
     while (innerKeys.hasNext()) { 
      switch (innerKeys.next().toString()) { 
       case "Id": 
        //User.setId(getValue(response, "Id")); 
        Toast.makeText(this, "" + data.getString("Id"), Toast 
         .LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    } 
    } catch (JSONException e) { 
     Log.e("Error : ", e.getMessage(), e); 
    } 

} 
尝试