1

Retrofit request API format(Android):

 @POST("getOrderStatus")
 @Headers("Content-Type:application/json")
 Observable<Response> getOrderInfo(@Query("timeStamp") long ts, @Body RequestOrderStatusBean bean);

BuildRequestOrderStatusBean.java

 public class BuildRequestOrderStatusBean {
        public int startNum;
        public int endNum;
    }

RequestOrderStatusBean.java

RequestOrderStatusBean is @Body parameter in Retrofit API getOrderInfo.

RequestOrderStatusBean object will be built with many same data structure but different var name BuildRequestOrderStatusBean object.

 public class RequestOrderStatusBean {
    // TODO: How to use BuildRequestOrderStatusBean to build RequestOrderStatusBean object?
     /**
      {
        "arrayA" : { "startNum" : 10,  "endNum" : 50  },
        "arrayB" : { "startNum" : 100, "endNum" : 200 },
        "arrayC" : { "startNum" : 230, "endNum" : 300}
        ...
     */
    }

QA: How to build RequestOrderStatusBean object(Retrofit @Body parameter) with BuildRequestOrderStatusBean object?

Ref:

  • com.squareup.retrofit:retrofit:1.9.0
  • io.reactivex:rxjava:1.1.0
  • io.reactivex:rxandroid:1.1.0
  • com.squareup.okhttp:okhttp:2.6.0
  • com.google.code.gson:gson:2.2.4
Vicky
  • 53
  • 1
  • 9

1 Answers1

1

It is not possible to create model class with dynamic keys instead you can use JsonObject to achieve the same (see carefully its JsonObject not JSONObject)

JsonObject arrayA = new JsonObject();
arrayA.addProperty("startNum", 10);
arrayA.addProperty("endNum", 50);

JsonObject arrayB = new JsonObject();
arrayB.addProperty("startNum", 100);
arrayB.addProperty("endNum", 200);

JsonObject object = new JsonObject();
object.add("arrayA", arrayA);
object.add("arrayB", arrayB); 

its output is

{
   "arrayA":{
            "startNum":10,"endNum":50
   },
   "arrayB":{
            "startNum":100,"endNum":200
   }
}

this is just an example you can add as many object as you want using for loop etc.

Then in retrofit change you interface method to @Body JsonObject bean

 @POST("getOrderStatus")
 @Headers("Content-Type:application/json")
 Observable<Response> getOrderInfo(@Query("timeStamp") long ts, @Body JsonObject bean);

retrofit will handle it like any other model class.

Nishant Pardamwar
  • 1,450
  • 12
  • 16
  • Thank you very much . If ``@Body`` bean is very simple,we can use the ``JsonObject``. But if is complicated, we can not use ``JsonObject``, because building the ``@Body`` bean is very time consuming and not flexible. – Vicky Jul 20 '17 at 05:15
  • 1
    @ Nishant Pardamwar, I have found the solution by using ``TypedInput`` – Vicky Jul 20 '17 at 07:24