【问题标题】:Scala: serialize case class to JSON , alternate namesScala:将案例类序列化为 JSON ,备用名称
【发布时间】:2014-08-09 03:34:51
【问题描述】:

任何将 Scala 案例类序列化为 JSON 并能够提供自定义序列化名称的方法?

例如,在 Java 中,这可以使用 Gson 库来完成:

 public class SomeClassWithFields {
   @SerializedName("name") private final String someField;
   private final String someOtherField;

   public SomeClassWithFields(String a, String b) {
     this.someField = a;
     this.someOtherField = b;
   }
 }

我尝试在 Scala 中这样做:

案例类 SomeClassWithFields(@SerializedName("name") 一些字段:字符串)

但是好像没有效果。

有什么想法吗?

【问题讨论】:

    标签: json scala serialization gson


    【解决方案1】:

    是的,它可以做到。方法如下:

    case class SomeClassWithFields(@(SerializedName @scala.annotation.meta.field)("name") someField:String)
    

    语法很奇怪(请注意,外部的“@”包装了“SerializedName”和 scala 字段注释)但它工作正常。查看更多详情:https://issues.scala-lang.org/plugins/servlet/mobile#issue/SI-8975

    【讨论】:

    • 是的,这有点奇怪,但它对我有用,非常感谢@Corindiano Dixie
    【解决方案2】:

    进一步改进 Corindiano 的答案,将其制成自定义注释,可以在其他地方(重新)使用。

    import scala.annotation.meta.field
    
    case class SomeClassWithFields(@SerializedNameField(value = "name") someField:String) { ... }
    object SomeClassWithFields {
        type SerializedNameField = com.google.gson.annotations.SerializedName @field
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 spray-json 调用 jsonFormat overloads 来实现。

      以下是它如何与您的示例一起使用:

      import spray.json._
      
      case class SomeClassWithFields( someField:String)
      
      object SomeClassJsonProtocol extends DefaultJsonProtocol {
        implicit val someClassFormat = jsonFormat(SomeClassWithFields,"name")
      }
      

      【讨论】:

      • 这个答案在 2014 年非常好。四年后,@Corindiano 提供了一个更好的答案,添加了语言功能,但我认为这不值得在 2021 年及以后投反对票。
      猜你喜欢
      • 2013-08-04
      • 2017-03-29
      • 2022-01-03
      • 2019-03-06
      • 1970-01-01
      • 2013-09-04
      • 2018-02-08
      • 2016-07-27
      • 1970-01-01
      相关资源
      最近更新 更多