【发布时间】:2022-02-14 22:14:22
【问题描述】:
我将 Firebase 数据库中的数据读入 Kotlin/Android 程序。 Firebase 中的键名与对应的 Kotlin 变量的键名不同。我使用平面 JSON 文件(出于充分的理由)测试此代码,其中保留了 Firebase 中使用的相同键名,因此我也需要转录它们。
Firebase 想要使用 @PropertyName 注释变量;但是我用来读取平面文件的 Gson 需要 @SerializedName(不幸的是,Firebase 不理解它。)
通过反复试验,我发现这恰好可行:
@SerializedName("seq")
var id: Int? = null
@PropertyName("seq")
get
@PropertyName("seq")
set
Firebase 和 Gson 都各司其职,我的班级获得了它的数据。我在这里被一根细线吊着吗?有没有更好的方法来做到这一点?
谢谢!,
【问题讨论】:
-
也许您可以使用 Kotlin 的
@JvmField注释来避免必须同时注释 getter 和 setter(尽管不太可能有更清洁的解决方案)。对于 Gson,一个低效的解决方法可能是首先反序列化为JsonObject,然后检查类的字段,并为每个@PropertyName将JsonObject中的属性从@PropertyName值重命名为字段值,然后让 Gson 再次反序列化它。其他 JSON 框架可能会更好地支持这一点。 -
谢谢。我决定添加一个中间类(其 var 名称与 Firebase 键相同)。这些注释让我失眠了:)
-
我的评论有点不对; Gson 的
FieldNamingStrategy支持从字段中获取注释(我完全忘了考虑这一点)。我现在写了一个正确的答案来描述这一点。但是,如果您已经找到了解决问题的方法,那也很好。
标签: firebase kotlin firebase-realtime-database gson