在我的Android应用程序中,将自定义数据类转换为字符串json后,我将其保存为共享首选项。在新版本中,我需要在这里向数据类添加一个新参数,并检查它并在相关的屏幕上显示它。当我发布带有添加参数的新版本应用程序时,旧版本的用户是否会遇到崩溃?或者可能的情况是什么。有人有主意吗?我使用Gson将数据类转换为JSON,然后再转换回数据类。
t98cgbkg1#
这很可能不是问题,因为如果字段的值丢失,Gson不会失败(参见related Gson feature request)。但是,如果数据来自应用的早期版本,并且该字段不存在值,则代码必须考虑新字段为null(或具有默认值的基元类型)。您还可以为字段分配默认值(例如,public String newField = "default";),如果JSON数据中缺少字段,则使用该字段,但在这种情况下,您必须确保您的类是static(显式或隐式)并且具有无参数构造函数。否则,您可能会遇到Gson使用JDK Unsafe的问题(另请参阅GsonBuilder.disableJdkUnsafe())。由于这是一个Android应用程序,您还必须确保您过去正确配置了ProGuard或R8,或者使用了@SerializedName。否则,您的JSON数据可能会使用混淆的字段名称,例如a,b ...这些名称可能会在应用的新版本中更改,这将阻止它阅读JSON数据。有关详细信息,请参阅Gson故障排除指南。
null
public String newField = "default";
static
GsonBuilder.disableJdkUnsafe()
@SerializedName
a
b
9jyewag02#
你可以把新的参数设为nullable,这样老的用户在解析之前不会崩溃。或者如果你使用Gson,你可以为数据类创建TypeAdapter,并在解析json字符串时执行逻辑以确保它成功。让我们检查:https://www.tutorialspoint.com/gson/gson_custom_adapters.htm
nullable
2条答案
按热度按时间t98cgbkg1#
这很可能不是问题,因为如果字段的值丢失,Gson不会失败(参见related Gson feature request)。但是,如果数据来自应用的早期版本,并且该字段不存在值,则代码必须考虑新字段为
null
(或具有默认值的基元类型)。您还可以为字段分配默认值(例如,
public String newField = "default";
),如果JSON数据中缺少字段,则使用该字段,但在这种情况下,您必须确保您的类是static
(显式或隐式)并且具有无参数构造函数。否则,您可能会遇到Gson使用JDK Unsafe的问题(另请参阅GsonBuilder.disableJdkUnsafe()
)。由于这是一个Android应用程序,您还必须确保您过去正确配置了ProGuard或R8,或者使用了
@SerializedName
。否则,您的JSON数据可能会使用混淆的字段名称,例如a
,b
...这些名称可能会在应用的新版本中更改,这将阻止它阅读JSON数据。有关详细信息,请参阅Gson故障排除指南。9jyewag02#
你可以把新的参数设为
nullable
,这样老的用户在解析之前不会崩溃。或者如果你使用Gson,你可以为数据类创建TypeAdapter,并在解析json字符串时执行逻辑以确保它成功。
让我们检查:https://www.tutorialspoint.com/gson/gson_custom_adapters.htm