如何在 Android 的改造请求中传递 JSON 对象并检索 JSON 对象?

Posted

技术标签:

【中文标题】如何在 Android 的改造请求中传递 JSON 对象并检索 JSON 对象?【英文标题】:How to pass JSON object and retrieve JSON object in retrofit request in Android? 【发布时间】:2015-12-13 17:23:22 【问题描述】:

我需要使用RetrofitPost 请求中传递Json。我的Json 看起来像这样:


  "q": 
         "reg": "IND",
         "or": [
                
                 "duration": "12"
                
              ]
       ,
 "sort": "recent"

我使用jsonschema2pojo为上面的Json创建了pojo,类似于:RoomListing.javaclass

现在我需要发出post 请求。所以我创建了一个API

public interface RoomListingAPI 

 @GET("/api/fetch")
 void getRoomListing(@Header("x-parse-session-token") String  
 token, @Body RoomListing list);

创建了一个RestAdapter

 return new RestAdapter.Builder()
                .setEndpoint(BASE_URL)
                .build();

RoomListingAPI apiservice = restadapter.providesRestAdapter().create(RoomListingAPI.class);

现在我有点困惑发送Json(看看RoomListing.java)作为post请求并接收JSON作为响应?

任何帮助都将不胜感激。

【问题讨论】:

为什么不把你的 json 作为字符串发送?并使用 import org.json.JSONArray 和 import org.json.JSONObject 来创建 json 结构。 我在改造中没有找到任何直接发送 JSON 的示例。 我发送了一个 JSON 作为字符串改造/POST,给我一些时间给你看。 【参考方案1】:

首先,您需要将注解从@GET 更改为@POST 以执行POST 请求。接下来,假设您使用的是 Retrofit 1.9.x,您需要执行以下两项操作之一来获取结果 JSON 响应,具体取决于您需要同步还是异步响应:

同步(在当前线程上) - 将 void 更改为响应的 pojo 类型,类似于您创建请求对象的方式(例如 ResponseType yourMethod(@Body RequestType object); 异步(在不同的线程上,带有回调) - 在方法的末尾添加一个Callback<ResponseType>,然后将在成功或不成功的请求返回时调用(例如void yourMethod(@Body RequestObject object, Callback<ResponseType> callback);

【讨论】:

我想在 JsonObject 中获取响应,因为它是动态 JSON 那么改造不是最好的选择 - 看看使用像 Volley 这样可以为你提供 JSONObjects 的东西 - 改造的设计是类型安全的,涵盖了“vanilla”案例 web 请求。 我们不能将 JSON 对象作为 post 请求发送并接收 JSON 对象吗?【参考方案2】:
    public interface RoomListingAPI 

     @POST("/api/fetch")
     void getRoomListing(@Header("x-parse-session-token") String  
     token, @Field("YOURFIELDNAME") String json);
    


//This method generates your json
private String yourJSON()

        JSONObject jsonRoot = new JSONObject();
        JSONObject jsonObject1 = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject2 = new JSONObject();
        try

            jsonArray.put(jsonObject2);

            jsonObject2.put("duration", "12");

            jsonObject1.put("reg", "IND");
            jsonObject1.put("or", jsonArray);

            jsonRoot.put("q", jsonObject1);
            jsonRoot.put("sort", "recent");

        catch (JSONException e)

            e.printStackTrace();
        
       return jsonRoot.toString();


    


    RoomListingAPI apiservice = restadapter.providesRestAdapter().create(RoomListingAPI.class);
apiservice.getRoomListing("your_header_token",yourJSON())...

我希望你工作,但应该是这样的。

【讨论】:

感谢您的回答,但我的请求中没有YOURFIELDNAME 。我只是将JSON 作为原始格式传递给Body

以上是关于如何在 Android 的改造请求中传递 JSON 对象并检索 JSON 对象?的主要内容,如果未能解决你的问题,请参考以下文章

Android:动态传递模型类来改造回调

如何在改造请求的正文中发布原始的整个 JSON?

如何在正文中传递api参数而不是@Query标签android kotlin改造

如何使用改造 2 在 Android 中获取 Json,如下面的代码所示?

改造 2 - 如何传递 POST json 对象

如何在body参数改造android中发送数组请求