在gson注释请求对象中设置可选字段

时间:2019-03-27 16:28:38

标签: android serialization gson

我的班级卡片和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}}}

2 个答案:

答案 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