Scala:将case类序列化为JSON,备用名称

时间:2014-06-18 18:09:24

标签: json scala serialization gson

是否可以将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”)   someField:字符串)

但它似乎没有效果。

有什么想法?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

通过将其作为自定义注释来进一步改善Corindiano的答案,该注释可以在其他地方(重新)使用。

import scala.annotation.meta.field

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

答案 2 :(得分:0)

你可以使用spray-json调用jsonFormat overloads

以下是您的示例:

import spray.json._

case class SomeClassWithFields( someField:String)

object SomeClassJsonProtocol extends DefaultJsonProtocol {
  implicit val someClassFormat = jsonFormat(SomeClassWithFields,"name")
}