【问题标题】:Why is @SerializedName not serializing fields when using Scala (works fine without annotation)为什么在使用 Scala 时@SerializedName 不序列化字段(没有注释也可以正常工作)
【发布时间】:2020-08-05 13:32:52
【问题描述】:

我有以下代码

case class BaseObject(
    ...
    dnsRecord: Array[DNSEntry],
    @SerializedName("dnsRecord") dnsEntries: Array[DNSEntry]
)

当我运行序列化时,dnsRecord 工作正常,而 dnsEntries 为空...

更新

@fluffy 让我想起了another question 我前段时间看到所以我把东西改成了

case class BaseObject(
    ...
    dnsRecord: Array[DNSEntry],
    @(SerializedName@scala.annotation.meta.field)("dnsRecord") dnsEntries: Array[DNSEntry]
)

这引发了一个问题,因为它试图使用已使用的 dnsRecord 字段。

【问题讨论】:

  • 使用 Java 库而不是 Scala 库的任何理由? - 顺便说一句,Arrays 通常不鼓励使用,但由于它们是可变的,它们不应该在 case 类中。
  • Scala,因为它运行在 Spark 集群上,转换起来太痛苦了
  • 我最近遇到了很多关于在 Scala 中使用 Gson 的问题,我现在最多只能说:Gson 不能在 Scala 中正常工作,应该找到更好的工具。原因:Scala 在幕后做了很多 Gson 不知道的复杂事情,同时它是一个纯 Java 专用工具。 Kotlin 也是如此。在stackoverflow.com/questions/63125448/…stackoverflow.com/questions/62259410/… 上查看更多信息
  • 现在回到这个问题。 @SerializedName 旨在使用字段,而不是(案例类构造函数)参数,只要 Gson ReflectiveTypeAdapterFactory 考虑对象字段,而不是其方法。在第二个链接的 Q/A 中有更深入的解释。简而言之,@(SerializedName@field)("dnsRecord") dnsEntries: Array[DNSEntry] 可能适合您。
  • @JGleason 我的建议是只使用 ListVector 并使用 circeujsonplay-json 或任何其他用于解析 json 的 Scala 原生库。

标签: scala gson


【解决方案1】:

答案看起来像这样......

case class BaseObject(
    ...
    @(SerializedName@scala.annotation.meta.field)("dnsRecord") dnsEntries: Array[DNSEntry]
)

甚至更好

object GsonScala {
  type SerializedName = com.google.gson.annotations.SerializedName @scala.annotation.meta.field
}
case class BaseObject(
    ...
    @GsonScala.SerializedName("dnsRecord") dnsEntries: Array[DNSEntry]
)

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2014-12-25
    • 2013-07-09
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多