【问题标题】:How to pass JSON object and retrieve JSON object in retrofit request in Android?如何在 Android 的改造请求中传递 JSON 对象并检索 JSON 对象?
【发布时间】: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,给我一些时间给你看。

标签: android json android-adapter retrofit


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
相关资源
最近更新 更多