Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.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正在重置JSON中没有返回的字段的值。变通办法?_Android_Json_Gson - Fatal编程技术网

Android Gson正在重置JSON中没有返回的字段的值。变通办法?

Android Gson正在重置JSON中没有返回的字段的值。变通办法?,android,json,gson,Android,Json,Gson,这里似乎有一个bug: 问题是我不知道任何解决办法,我对Gson还相当陌生。在我的POJO中有一个我自己设置的布尔字段,它不在JSON中,我设置为true,当Gson解析对象时,它的“设置回false”。不应该发生的行为 这就是我迄今为止所尝试的: Gson gson = new GsonBuilder() .serializeNulls() .setExclusionStrategies(new E

这里似乎有一个bug:

问题是我不知道任何解决办法,我对Gson还相当陌生。在我的POJO中有一个我自己设置的布尔字段,它不在JSON中,我设置为
true
,当Gson解析对象时,它的“设置回
false
”。不应该发生的行为

这就是我迄今为止所尝试的:

Gson gson = new GsonBuilder()
                        .serializeNulls()
                        .setExclusionStrategies(new ExclusionStrategy() {
                            @Override
                            public boolean shouldSkipField(FieldAttributes f) {
                                return f.getName().equals("reviewed");
                            }

                            @Override
                            public boolean shouldSkipClass(Class<?> clazz) {
                                return false;
                            }
                        })
                        .create();
Gson不会真正将字段“重置”为其默认值。它实际上是从您为它提供的类创建一个新实例。然后将来自json的所有字段设置为对象


这是你应该做的。您必须在json返回的同一个实例中设置
revieved
字段。

您的
revieved
字段是什么样子的?它是一个基本的
boolean
还是一个包装器
boolean
?它有任何初始值设定项吗?@LyubomyrShaydariv更新了我的问题,将布尔值设置为primitives,但这并没有解决它。这是因为primitives字段总是获得默认值。@RED_u现在更清楚了。:)Gson不会反序列化到现有对象中——它总是创建新的对象,因此您必须自己管理从原始到反序列化的对象状态(您选择实现本身),即使您不喜欢创建新对象(但这确实是一个很好的设计选择)。关于归档的bug:也许前几天它确实是一个有效的问题,但它绝对不能在Gson 2.8.0中复制。@RED_u我很高兴能帮到你。因为你的问题只在评论中才变得清晰,也许你最好奖励——阿卜杜拉在我意识到你的问题是什么之前就建议你完全一样。:)
private boolean reviewed;

//Getters and setters
public boolean isReviewed() {
    return reviewed;
}

public void setReviewed(boolean reviewed) {
    this.reviewed = reviewed;
}