Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala.js中的scala json未序列化_Scala_Scala.js - Fatal编程技术网

scala.js中的scala json未序列化

scala.js中的scala json未序列化,scala,scala.js,Scala,Scala.js,我正在尝试使用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.commen

我正在尝试使用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 js。在scala js应用程序的顶层(入口点)发生的任何异常都不会总是正确地回显(取决于环境/浏览器),如果您在捕获期间将整个事件包装在一个Try中并打印出堆栈跟踪,您应该可以成功地看到异常被抛出

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

以下是正常的非宏观方法:

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等其他LIB相比,它“没有那么神奇”,circe使用“无形状”自动派生工厂,有时是以臃肿的方式。scala json旨在使访问器在扩展时保持可见,但这确实会导致一些显式的样板文件

这可以通过使用宏来减少:

@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”字段自动添加到伴随对象