我的班级卡片和qrCode中有两个字段:
public class User{
@SerializedName("card")
private String card;
@SerializedName("qrCode")
private boolean qrCode
...
}
我对此对象进行了序列化请求。但是,在我的后端,这些字段在部署之前不存在。旧值是对象,而不是String或boolean。
因此,我在响应中收到此错误:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1
是否可以在我的请求中将这些字段设置为可选字段?
我的答复是这个JSON:
{"success":true,"msg":"founded","data":{..."card":{"success":false,"msg":"Not found","data":null}}}
答案 0 :(得分:1)
您需要实现将type E = D<"a"> | D<"b"> | D<0> | D<true> //
type E = ("a" extends string ? "a" : "nope") |
("b" extends string ? "b" : "nope") |
(0 extends string ? 0 : "nope") |
(true extends string ? true : "nope") //
type E = ("a") | ("b") | ("nope") | ("nope") //
type E = "a" | "b" | "nope" //
转换为T
的自定义解串器:
JSON object
您可以按以下方式使用它:
String
示例用法:
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;
}
}
打印:
@SerializedName("card")
@JsonAdapter(ObjectOrStringJsonDeserializer.class)
private String card;
您可以为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}
转换为boolean qrCode
并使用JSON object
批注进行注册的自定义反序列化器。
答案 1 :(得分:0)
这不是参数问题。这与您得到的答复有关。
您可能会在响应中得到JSONObject
,但是您将参数强制转换为string
。