【问题标题】:Kotlin: Json: conflicting annotation schemes for name transcriptionKotlin:Json:名称转录的冲突注释方案
【发布时间】: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,然后检查类的字段,并为每个 @PropertyNameJsonObject 中的属性从 @PropertyName 值重命名为字段值,然后让 Gson 再次反序列化它。其他 JSON 框架可能会更好地支持这一点。
  • 谢谢。我决定添加一个中间类(其 var 名称与 Firebase 键相同)。这些注释让我失眠了:)
  • 我的评论有点不对; Gson 的FieldNamingStrategy 支持从字段中获取注释(我完全忘了考虑这一点)。我现在写了一个正确的答案来描述这一点。但是,如果您已经找到了解决问题的方法,那也很好。

标签: firebase kotlin firebase-realtime-database gson


【解决方案1】:

您可能可以通过使用 Kotlin 的 @JvmField 来抑制 getter 和 setter 的生成来解决这个问题。这应该允许您将 @PropertyName 注释直接放在属性上。然后,您可以实现一个 Gson FieldNamingStrategy,它检查字段上是否存在 @PropertyName 注释,在这种情况下使用它的值;否则它可以返回字段名称。 FieldNamingStrategy 必须是 set on a GsonBuilder,然后您可以使用它来创建 Gson 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2023-02-10
    相关资源
    最近更新 更多