【问题标题】:JSON4S does not serialize internal case class membersJSON4S 不序列化内部案例类成员
【发布时间】:2016-12-28 19:57:32
【问题描述】:

我有一个继承自特征的案例类:

trait Thing {
  val name: String
  val created: DateTime = DateTime.now
}

case class Door(override val name: String) extends Thing

这是 akka-http,我正在尝试将 JSON 返回到 get 请求:

...
~
    path ("get" / Segment) { id =>
      get {

        onComplete(doorsManager ? ThingsManager.Get(id)) {
          case Success(d: Door) => {
            complete(200, d)
          }
          case Success(_) => {
            complete(404, s"door $id not found")
          }
          case Failure(reason) => complete(500, reason)
        }
      }
    } ~
...

但我只得到名称的 JSON。我确实在范围内有隐式 Joda 序列化程序。 如果我在案例类的构造函数中覆盖“创建”时间戳,它确实会被序列化,但它定义了目的,因为我不需要(或不希望)用户提供时间戳。我尝试将时间戳移到 Door 中(作为覆盖或只是跳过特征),结果是相同的(即没有“创建”)。

我如何告诉 JSON4S 也序列化内部成员(和继承的成员)?

【问题讨论】:

    标签: scala akka-http json4s


    【解决方案1】:

    您必须定义自定义格式。

    import org.json4s.{FieldSerializer, DefaultFormats}
    import org.json4s.native.Serialization.write
    
    case class Door(override val name: String) extends Thing
    trait Thing {
      val name: String
      val created: DateTime = DateTime.now
    }
    
    implicit val formats = DefaultFormats + FieldSerializer[Door with Thing()]
    
    val obj = new Door("dooor")
    write(obj) 
    

    【讨论】:

    • 首先,感谢您的回复。我假设 FieldSerializer[Door with Thing()] (没有编译)是 FieldSerializer[Door with Thing]() 的错字(它确实编译了)我在 Door 本身、Door 的伴随对象和 API 中都应用了你的建议班级。仍然没有返回日期。
    • 好的。有效。我有另一个隐含在里面的东西,它是相似的(虽然不包括门)。删除它并将隐式格式放入 Door 的伴随对象(并添加 ++ JodaTimeSerializers.all)后,它似乎也包含时间戳
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2016-01-13
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多