Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在gson注释请求对象中设置可选字段_Android_Serialization_Gson - Fatal编程技术网

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

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

我的课程卡和qrCode中有两个字段:

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}