Scala:将case类序列化为JSON,替换名称

Scala:将case类序列化为JSON,替换名称,json,scala,serialization,gson,Json,Scala,Serialization,Gson,有没有办法将Scala case类序列化为JSON并能够提供自定义序列化名称 例如,在Java中,这可以使用Gson库完成: public class SomeClassWithFields { @SerializedName("name") private final String someField; private final String someOtherField; public SomeClassWithFields(String a, String b) {

有没有办法将Scala case类序列化为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(“名称”) someField:String)

但似乎没有效果


有什么想法吗

您可以通过调用

下面是它如何与您的示例一起工作:

import spray.json._

case class SomeClassWithFields( someField:String)

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

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

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

语法很奇怪(请注意,外部的“@”包装了“SerializedName”和scala字段注释),但工作正常。有关更多详细信息,请参见:

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

import scala.annotation.meta.field

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

是的,这有点奇怪,但对我来说很有效,非常感谢@Corindiano Dixieth。这个答案在2014年非常好。四年后,@Corindiano提供了一个更好的答案,增加了语言功能,但我认为这不值得在2021年及以后的投票中否决。