【问题标题】:Scala - Circe - Case Class Serialization without Class NameScala - Circe - 没有类名的案例类序列化
【发布时间】:2019-03-06 18:12:09
【问题描述】:

我以前使用Circe 进行案例类序列化/反序列化,并且喜欢它如何在没有其他 Scala JSON 库所需的样板代码的情况下使用,但我现在遇到了一个问题,我不确定如何使用解决。我有一个 ADT(一个带有多个案例类实例的密封特征),我想一般处理(来自我的 Akka Http 服务,使用 akka-http-json)(即,返回一个 List[Foo],其中 Foo 是特征-类型),但是当我使用 Circe 的自动推导(通过 Shapeless)这样做时,它使用特定案例类名称作为“鉴​​别器”序列化实例(例如,如果我的 List[Foo] 包含 Foo1 的实例,那么每个结果序列化列表中的元素将具有键 Foo1)。我想消除类型名称作为鉴别器(即,不是让序列中的每个元素都以类型名称为前缀 - 例如,"Foo1": {"id : "1", name : "First",...},我只想序列化案例类实例以包含字段案例类的:例如,{"id":"1,"name:"First",...}...本质上,我想消除类型名称键(我不希望前端必须知道每个元素在后面属于哪个具体案例类-end)。

要序列化的列表中的所有元素都将具有相同的具体类型,所有这些都将是我的 ADT(特征)类型的子类型。我相信这可以使用 Circe 的 semi -自动派生,虽然我没有机会确切地弄清楚如何。基本上,我想尽可能多地使用 Circe 的自动派生,但消除出现在结果 JSON 中的外部类名。任何非常感谢您的帮助/建议!谢谢!

【问题讨论】:

    标签: json scala shapeless circe


    【解决方案1】:

    您可以按照文档中的说明进行操作:https://circe.github.io/circe/codecs/adt.html

    import cats.syntax.functor._
    import io.circe.{ Decoder, Encoder }, io.circe.generic.auto._
    import io.circe.syntax._
    
    object GenericDerivation {
      implicit val encodeEvent: Encoder[Event] = Encoder.instance {
        case foo @ Foo(_) => foo.asJson
        case bar @ Bar(_) => bar.asJson
        case baz @ Baz(_) => baz.asJson
        case qux @ Qux(_) => qux.asJson
      }
    
      implicit val decodeEvent: Decoder[Event] =
        List[Decoder[Event]](
          Decoder[Foo].widen,
          Decoder[Bar].widen,
          Decoder[Baz].widen,
          Decoder[Qux].widen
        ).reduceLeft(_ or _)
    }
    
    import GenericDerivation._
    import io.circe.parser.decode
    
    decode[Event]("""{ "i": 1000 }""")
    // res0: Either[io.circe.Error,Event] = Right(Foo(1000))
    
    (Foo(100): Event).asJson.noSpaces
    // res1: String = {"i":100}
    

    【讨论】:

      【解决方案2】:

      这可能不是最好的答案,但经过更多搜索,这就是我能够找到的。与其将类名作为生成的 Json 中的键,不如将其序列化为字段,如下所示:

      implicit val genDevConfig: Configuration = Configuration.default.withDescriminator("type")
      

      (您可以在此处使用任何您喜欢的字段名称;Travis Brown 之前针对类似问题的 example 使用了一个名为 what_am_i 的字段)。所以我很抱歉——我还不知道是否有一个规范的或被广泛接受的解决方案来解决这个问题,尤其是使用 akka-http-json 之类的库很容易与 Akka Http 一起工作的解决方案,我似乎仍然遇到了一些问题,尽管我确信我可能忽略了一些明显的东西!无论如何,我很抱歉提出一个似乎反复出现的问题!

      【讨论】:

        猜你喜欢
        • 2017-03-29
        • 2019-03-28
        • 1970-01-01
        • 2013-08-12
        • 2021-05-28
        • 2014-08-09
        • 2019-03-15
        • 2019-03-13
        • 2018-10-22
        相关资源
        最近更新 更多