如何在Body中发布原始类型的JSON数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Body中发布原始类型的JSON数据?相关的知识,希望对你有一定的参考价值。

我正在使用Volley请求向服务器发送一个帖子请求,并且我有一些必须发送的原始类型JSON数据。在这里我不知道如何发送第四个对象学生,这是Array类型。

要发布的JSON数据是


"course_id":1,
"batch_id":1,
"subject_id":1,
"students":["student_id":6,"present":0,"student_id":17,"present":0] 

我的代码

private void fetchDataAndMarkAttendence() 
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() 
        @Override
        public void onResponse(String response) 
            try 
                JSONObject jsonObject = new JSONObject(response);
                status = jsonObject.getString("status");
             catch (JSONException e) 
                    e.printStackTrace();
                
            
        , new Response.ErrorListener() 
            @Override
            public void onErrorResponse(VolleyError error) 
                error.printStackTrace();
            
        )
        @Override
       public Map<String, String> getHeaders() throws AuthFailureError 
           HashMap<String, String> map = new HashMap<String, String>();
           SharedPreferences prefs = getApplicationContext().getSharedPreferences(MY_PREFS_NAME, Activity.MODE_PRIVATE);
                token = prefs.getString("token","");
                map.put("Authorization", "Token "+token);
                return map;
            
        
    

所以,关于如何发布上述JSON数据的任何帮助都会有所帮助。

答案

这称为JSONArray。

try 

        JSONArray jsonArray = jsonObject.getJSONArray();

        for (int i = 0; i < jsonArray.length(); i++) 
            int student_id = jsonObject.getInt("student_id");
            int present = jsonObject.getInt("present");
        

     catch (JSONException e) 
        e.printStackTrace();
    

编辑

提到,你想发布json。因此,在代码下面创建json suing并将mainJsonObject.toString();作为参数发布。

 try 

        JSONObject mainJsonObject = new JSONObject();

        JSONArray jsonArray = new JSONArray();
        //if more than one then wrap inside loop
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("student_id", value);
        jsonObject.put("present", value);
        jsonArray.put(jsonObject);
        //end loop

        mainJsonObject.put("course_id", value);
        mainJsonObject.put("batch_id", value);
        mainJsonObject.put("subject_id", value);
        mainJsonObject.put("students", jsonArray);

     catch (JSONException e) 
        e.printStackTrace();
    

希望能帮助到你。

另一答案

用JsonObjectRequest替换StringRequest

JSONObject postparams = new JSONObject();
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
url, postparams,
new Response.Listener() 
    @Override
    public void onResponse(JSONObject response) 
        //Success Callback
    
,
new Response.ErrorListener() 
    @Override
    public void onErrorResponse(VolleyError error) 
        //Failure Callback
    
);
另一答案

你能试试吗?这可能会解决您的问题。

RequestQueue requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() 
    @Override
    public void onResponse(String response) 
        try 
            JSONObject jsonObject = new JSONObject(response);
            status = jsonObject.getString("status");
         catch (JSONException e) 
                e.printStackTrace();
            
        
    , new Response.ErrorListener() 
        @Override
        public void onErrorResponse(VolleyError error) 
            error.printStackTrace();
        
    )
    @Override
    public byte[] getBody() throws AuthFailureError 
        String yourJSON = yourJsonObj.toString() ;
        return yourJSON.getBytes();
    
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError 
         HashMap<String, String> map = new HashMap<String, String>();
         SharedPreferences prefs = getApplicationContext().getSharedPreferences(MY_PREFS_NAME, Activity.MODE_PRIVATE);
              token = prefs.getString("token","");
              map.put("Authorization", "Token "+token);
              return map;
   
;

以上是关于如何在Body中发布原始类型的JSON数据?的主要内容,如果未能解决你的问题,请参考以下文章

你可以在 Guzzle POST Body 中包含原始 JSON 吗?

如何在 Spring REST 控制器中获取原始 JSON 正文?

如何在 React Fetch Blob 中使用 content-Type JSON(application/json) 发布原始正文数据

如何在 Laravel 5 中获取原始 json 请求有效负载?

JSON 序列化与反序列化(-)泛型 及 java.lang.reflect.Type

JSON对象的深拷贝和浅拷贝