改进字符串数组发送对象表示而不是请求中的值。

时间:2016-07-19 16:03:10

标签: java android jackson retrofit retrofit2

我在我的Android项目中使用带有Jackson转换器的Retrofit 2,并提出以下请求:

@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") List<String> array);

以下是我传递给接口方法的值:

// the array of strings @Field param
ArrayList<String> arrayOfStrings = new ArrayList<>();
arrayOfStrings.add("1.2");
// the id param
int id = 2;

我运行应用程序,让API调用执行请求,然后通过Charles检索请求。

这是问题所在。请求参数&#34; array_of_strings&#34;正在使用对象引用发送,而不是数组对象的实际值:

// charles request shows:
array_of_strings [I@41fea508
// instead of:
array_of_stings ["1.2"]

如何让Retrofit / Jackson使用数组对象的值而不是对象引用值?

2 个答案:

答案 0 :(得分:0)

我想您应该只在[]字段名称中添加array_of_strings括号,因此Retrofit会知道您要发送数组并将其正确转换为数组字段:

@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings[]") List<String> array);

答案 1 :(得分:0)

通过rom4ek在此答案中的评论,使用ArrayList<String>作为参数类型是解决方案。 Jackson必须以不同于数组或列表的方式序列化ArrayLists。

@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") ArrayList<String> array);