使用 Retrofit 发送 ArrayList<Object> POST 请求

Moj*_*med 3 android retrofit

我想将这样的东西发送到服务器

{
  "InoorPersonID": "",
  "Discount": 0,
  "DiscountDescription": "",
  "Description": "",
  "OrderDetailList": [
    {
      "ProductID": 0,
      "Amount": 0
    }
  ],
  "ClientId": "",
  "ClientSecret": ""
}
Run Code Online (Sandbox Code Playgroud)

这是我的服务接口

public interface StoreRetrofitSalesService {

    @FormUrlEncoded
    @POST(ServiceUrl.URL_ORDER_SET)
    Call<ServiceResult<Integer>> orderSet(@Field("OrderDetailList") ArrayList<OrderDetail> orderDetails,
                                          @Field("Discount") String discount,
                                          @Field("ClientId") String clientId,
                                          @Field("ClientSecret") String clientSecret,
                                          @Field("Description") String description,
                                          @Field("InoorPersonID") String inoorPersonId,
                                          @Field("DiscountDescription") String discountDescription);

}
Run Code Online (Sandbox Code Playgroud)

logcat 显示了这一点

OrderDetailList=org.crcis.noorreader.store.OrderDetail%408208296&Discount=0&...
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 为什么 OrderDetailList 不能转换为 JSON。
  2. 我如何为这个参数使用@FieldMap。我最近测试Map<String, Object>但它返回相同的结果。

谢谢

Nik*_*ono 5

使用 GSON

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(myBaseUrl)
    .addConverterFactory(GsonConverterFactory.create())
    .build();
Run Code Online (Sandbox Code Playgroud)

像这样为您的数据创建一个模型

public class Order {

    @SerializedName("InoorPersonID")
    String inoorPersonId;
    @SerializedName("Discount")
    int discount;
    @SerializedName("DiscountDescription")
    String discountDescription;
    @SerializedName("Description")
    String description;
    @SerializedName("OrderDetailList")
    ArrayList<OrderDetail> orderDetailList;
    @SerializedName("ClientId")
    String clientId;
    @SerializedName("ClientSecret")
    String clientSecret;

    //Don't forget to create/generate the getter and setter
}
Run Code Online (Sandbox Code Playgroud)

并将您的服务更改为

public interface StoreRetrofitSalesService {

    @POST(ServiceUrl.URL_ORDER_SET)
    Call<ServiceResult<Integer>> orderSet(@Body Order order);

}
Run Code Online (Sandbox Code Playgroud)