Java 改型调用具有相同的名称和不同的数据类型

Java 改型调用具有相同的名称和不同的数据类型,java,json,gson,retrofit2,Java,Json,Gson,Retrofit2,API调用 @GET("users/{user_id}/grid") Call<ArrayList<Grid>> getGrid(@Path("user_id") Integer id, @Header("Authorization") String authHeader); Grid.class public class Grid { @SerializedName("category") @Expose pr

API调用

@GET("users/{user_id}/grid")
    Call<ArrayList<Grid>> getGrid(@Path("user_id") Integer id, @Header("Authorization") String authHeader);

Grid.class
public class Grid {

        @SerializedName("category")
        @Expose
        private String category;

        @SerializedName("type")
        @Expose
        private String type;

        @SerializedName("title")
        @Expose
        private String title;

        @SerializedName("equation_list")
        @Expose
        private List<Integer> equationList = null;  // This is the issue
}
但我有个例外

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException: 应为BEGIN_数组,但在第1行第1586列路径处为字符串 $[5]。方程式列表


如何满足我的要求?

我认为您可以创建一个类型来处理StringArrayList两种数据类型。然后,您可以为GSON实现一个自定义的
JsonAdapter
,以处理此类型的自定义反序列化

让我们创建从
java.util.ArrayList

/**
*处理字符串和ArrayList类型的自定义类型
*
*@作者Yavuz Tas
*
*/
公共类EquationList扩展了ArrayList{
}
在我们为
EquationList
类型实现
JsonAdapter
之后

/**
*GSON处理{@link equalationlist}会话的自定义JsonAdapter
* 
*@作者Yavuz Tas
*
*/
公共类EquationListJsonAdapter扩展了TypeAdapter{
@凌驾
public void write(JsonWriter out,equalationlist用户)抛出IOException{
//因为我们没有通过gson序列化EquationList,所以可以省略这一部分。
//如果你需要,你可以查一下
//com.google.gson.internal.bind.ObjectTypeAdapter类
//基本对象序列化实现的read方法
}
@凌驾
公共EquationList读取(JsonReader in)引发IOException{
EquationList反序列化对象=新EquationList();
//下一个令牌的类型
JsonToken peek=in.peek();
//如果json字段是字符串
if(JsonToken.STRING.equals(peek)){
String stringValue=in.nextString();
//将字符串转换为整数并作为值添加到列表中
反序列化对象.add(Integer.valueOf(stringValue));
}
//如果是数组,则实现正常的数组反序列化
if(JsonToken.BEGIN_ARRAY.equals(peek)){
in.beginArray();
while(在.hasNext()中){
String元素=in.nextString();
反序列化object.add(Integer.valueOf(element));
}
in.endArray();
}
返回反序列化对象;
}
}
最后,我们将适配器注册到
网格中的
等式列表
字段

公共类网格{
@序列化名称(“类别”)
@暴露
私有字符串类别;
@序列化名称(“类型”)
@暴露
私有字符串类型;
@序列化名称(“标题”)
@暴露
私有字符串标题;
@JsonAdapter(value=equalationListJSONAdapter.class)
@序列化名称(“方程式列表”)
@暴露
私人等式列表;
}
这将正确处理您的回答,如下所示

"equation_list": "7", or "equation_list": [7]
请注意,任何
字符串
响应都会自动转换为
整数
,并作为列表元素添加到
等式列表
。您可以通过更改
EquationListJsonAdapter
read
方法中的实现来更改此行为

我希望这有帮助。干杯

"equation_list": "7", or "equation_list": [7]