Android 在gson注释请求对象中设置可选字段
我的课程卡和qrCode中有两个字段:Android 在gson注释请求对象中设置可选字段,android,serialization,gson,Android,Serialization,Gson,我的课程卡和qrCode中有两个字段: public class User{ @SerializedName("card") private String card; @SerializedName("qrCode") private boolean qrCode ... } 我请求序列化此对象。但是,在我的后端,这些字段在部署之前不存在。旧值是对象,而不是字符串或布尔值 因此,我在回复中收到以下错误: com.google.gson.JsonSynt
public class User{
@SerializedName("card")
private String card;
@SerializedName("qrCode")
private boolean qrCode
...
}
我请求序列化此对象。但是,在我的后端,这些字段在部署之前不存在。旧值是对象,而不是字符串或布尔值
因此,我在回复中收到以下错误:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1
有没有办法在我的请求中使这些字段成为可选的
我的回答是:
{"success":true,"msg":"founded","data":{..."card":{"success":false,"msg":"Not found","data":null}}}
这与参数无关。这是你得到的回应的问题
在您的响应中获取
JSONObject
可能会有问题,但您将该参数转换为字符串
您需要实现自定义反序列化程序,将JSON对象
转换为字符串
:
class ObjectOrStringJsonDeserializer implements JsonDeserializer<String> {
@Override
public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
if (json.isJsonPrimitive()) {
return json.getAsJsonPrimitive().getAsString();
}
if (json.isJsonObject()) {
return json.getAsJsonObject().toString();
}
return null;
}
}
用法和示例:
Gson gson = new GsonBuilder().create();
String json = "{\"card\":{\"success\":false,\"msg\":\"Not found\",\"data\":null}}";
System.out.println(gson.fromJson(json, User.class));
印刷品:
User{card='{"success":false,"msg":"Not found","data":null}', qrCode=false}
您可以对
布尔qrCode
执行相同的操作。您需要编写自定义反序列化程序,将JSON对象
转换为布尔值
,并使用@JsonAdapter
注释注册它。您能分享您的JSON吗。@MehulKabaria有问题。
User{card='{"success":false,"msg":"Not found","data":null}', qrCode=false}