【问题标题】:scala-json unserialize in scala.jsscala-json 在 scala.js 中反序列化
【发布时间】:2016-10-30 05:41:33
【问题描述】:

我正在尝试使用 scala-json https://github.com/MediaMath/scala-json 将 JSON 从 Ajax 请求转换为 Scala.js 中的 Case 类

这是我的课程:

sealed trait Result
sealed trait Error extends Result
sealed trait Msg extends Result
case class MsgData(msg: Seq[String], args: Seq[Int]) extends Msg

case class CommentError(@name("obj.comment") comment: Seq[MsgData]) extends Error

这是我尝试转换的方式:

import json._
implicit val msgDataAcc = ObjectAccessor.create[MsgData]
implicit val commentErrorAcc = ObjectAccessor.create[CommentError]

println("here2")
val errors = JValue.fromString(req.responseText).toObject[CommentError]
println("here3")

这段代码只是在转换后的字符串上默默地死掉,“here3”从未打印到控制台。

这是来自服务器的 JSON:

{"obj.comment":[{"msg":["error.minLength"],"args":[10]}],"obj.name":[{"msg":["error. path.missing"],"args":[]}]}

我做错了什么?如何解决这个问题?

【问题讨论】:

    标签: scala scala.js


    【解决方案1】:

    所以我猜这是 scala-js。如果您将整个事情包装在 Try 中并在运行期间打印出堆栈跟踪,则在 scala-js 应用程序的顶层(入口点)发生的任何异常并不总是正确回显(取决于环境/浏览器) catch,你应该成功地看到异常被抛出。

    上面的主要问题是您需要为案例类定义“访问器”。有两种方法可以做到这一点,一种通过为每种类型添加隐式来开箱即用,另一种方法需要宏天堂,并为您提供了一种更简单的方法来定义案例类的访问器。

    这里是正常的非宏观天堂方式:

    case class MsgData(msg: Seq[String], args: Seq[Int]) extends Msg
    object MsgData {
      implicit val acc = ObjectAccessor.create[MsgData]
    }
    
    case class CommentError(@name("obj.comment") comment: Seq[MsgData]) extends Error
    object CommentError {
      implicit val acc = ObjectAccessor.create[CommentError]
    }
    

    隐式可以放在任何地方(遵循 scala 隐式的一般规则)。将它们放在伴生对象中是保证隐式可以在任何地方找到的最佳方式,无需特殊导入或任何需要。

    这比 circe 等使用 shapeless 自动派生工厂的其他库“没有那么神奇”,有时以臃肿的方式。 scala-json 旨在保持访问器可见以用于扩展目的,但这确实会导致一些显式的样板文件。

    这可以使用macro-paradise来减少:

    @accessor case class MsgData(msg: Seq[String], args: Seq[Int]) extends Msg
    @accessor case class CommentError(@name("obj.comment") comment: Seq[MsgData]) extends Error
    

    这与上面的代码完全一样,我们只是利用macro-paradise 自动将隐式'acc' 字段添加到伴随对象。

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2021-06-11
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2014-07-02
      • 2014-05-18
      相关资源
      最近更新 更多