Java 改型调用具有相同的名称和不同的数据类型
API调用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
@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]。方程式列表
如何满足我的要求?我认为您可以创建一个类型来处理String和ArrayList两种数据类型。然后,您可以为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]