Scala upickle:反序列化期间的字符串值无效

Scala upickle:反序列化期间的字符串值无效,scala,scala.js,upickle,Scala,Scala.js,Upickle,我是scala.js领域的新手,所以我决定在一些小示例上进行尝试,其中一个示例是非常简单的get请求,通过解析将json返回到scala实体中 请在下面查找执行此操作的代码: def loadAndDisplayPosts(postsElement: Element) = { jQuery.get( url = "/posts", success = { (data: js.Any) => val stringify = JSON.strin

我是scala.js领域的新手,所以我决定在一些小示例上进行尝试,其中一个示例是非常简单的get请求,通过解析将json返回到scala实体中

请在下面查找执行此操作的代码:

def loadAndDisplayPosts(postsElement: Element) = {
  jQuery.get(
    url = "/posts",
    success = {
      (data: js.Any) =>
        val stringify = JSON.stringify(data)
        console.log(stringify)
        val posts = read[List[Post]](stringify)
        console.log(posts.size)
        posts.map(render).foreach(postsElement.appendChild)
    }
  )
}
log(stringify)返回以下json:

[
  {
    "title": "Some fancy title",
    "content": "some very long string with \"escaped\" characters",
    "tags": [
      "algorithms"
    ],
    "created": 1474606780004
  }
]
当一切都归结到

read[List[Post]](stringify)
我得到以下例外情况:

upickle.Invalid$Data: String (data: 1474606780004)
所以问题是:有没有做错什么?这种行为有什么正当的理由吗

所用库的版本:

"com.lihaoyi" %%% "upickle" % "0.4.1"
编辑:

添加实体本身:

case class Post(title: String,
                  content: String,
                  tags: List[String] = List.empty,
                  created: Long = System.currentTimeMillis())
编辑2:

以下代码产生相同的错误:

val post = Post("Some title", "some \"content\"", List("algorithms"), 1474606780004L)
val json = write[List[Post]](List(post))

提前感谢您的澄清。

uPickle将
Long
s序列化为JSON中的字符串,因为JavaScript数字不能表示所有
Long
s


因此,对象的
创建的
字段应该是字符串
“1474606780004”

uPickle将
Long
s序列化为JSON中的字符串,因为JavaScript数字不能代表所有
Long
s


因此,对象的
创建的
字段应该是字符串
“1474606780004”

事实证明,正确答案如下:

字符串只是部分正确答案。您还可以使用Double(至少您可以在scala端免费获得实际long的自由转换)

因此,我最终得到了以下工作正常的实体:

case class Post(title: String,
                  content: String,
                  tags: List[String] = List.empty,
                  created: Double = System.currentTimeMillis())

事实上,正确的答案是:

字符串只是部分正确答案。您还可以使用Double(至少您可以在scala端免费获得实际long的自由转换)

因此,我最终得到了以下工作正常的实体:

case class Post(title: String,
                  content: String,
                  tags: List[String] = List.empty,
                  created: Double = System.currentTimeMillis())


我相信upickle将
Long
s序列化为JSON字符串。尝试在手动实例化的帖子列表上调用
write
,并将输出与
stringify
字符串进行比较。或者,您可以调用
readJs
而不是
read
,传递
数据
而不是
字符串化
?将回调签名更改为data:Js.Value并调用readJs方法会导致此异常:scala.scalajs.runtime.UndefinedBehaviorError:检测到未定义的行为:[object object]、[object object object]、[object object object]、[object object object]、[object object object]不是upickle.Js$ValueEdited问题的一个实例,带有编写示例,但不起作用。你可以发布
write
的结果吗?我相信upickle会将
Long
s序列化为JSON字符串。尝试在手动实例化的帖子列表上调用
write
,并将输出与
stringify
字符串进行比较。或者,您可以调用
readJs
而不是
read
,传递
数据
而不是
字符串化
?将回调签名更改为data:Js.Value并调用readJs方法会导致此异常:scala.scalajs.runtime.UndefinedBehaviorError:检测到未定义的行为:[object object]、[object object object]、[object object object]、[object object object]、[object object object]不是upickle.Js$ValueEdited问题的一个实例,带有编写示例,但不起作用。您可以发布
write
的结果吗?谢谢您的回复。对我来说,创建的
只是一个时间戳。例如,uPickle是否能够从java 8日期/时间API处理LocalDateTime?同样从uPickle网站:开箱即用,uPickle支持编写和读取以下类型:布尔型、字节型、字符型、短型、整型、长型、浮点型、双精度。为什么库不能处理具有
Long
字段的case类?“uPickle将Long序列化为JSON中的字符串”—不是真的
write[List[Post]](List(Post))
产生相同的异常,因此我最好说它根本不适用于
Long
类型。我是否应该在原始问题的
EDIT 2
中创建关于
write
问题的单独问题,或者您将在同一线程中提供解释,当我使用jackson库创建json并使用本机js解析它时,不知何故我没有遇到这种问题(“JavaScript数字不能代表所有长度”),谢谢您的回复。对我来说,创建的
只是一个时间戳。例如,uPickle是否能够从java 8日期/时间API处理LocalDateTime?同样从uPickle网站:开箱即用,uPickle支持编写和读取以下类型:布尔型、字节型、字符型、短型、整型、长型、浮点型、双精度。为什么库不能处理具有
Long
字段的case类?“uPickle将Long序列化为JSON中的字符串”—不是真的
write[List[Post]](List(Post))
产生相同的异常,因此我最好说它根本不适用于
Long
类型。我是否应该在原始问题的
EDIT 2
中创建关于
write
问题的单独问题,或者您将在同一线程中提供解释,当我使用jackson库创建json并使用本机js对其进行解析时,不知何故我并没有遇到这种问题(“JavaScript数字不能代表所有长度”)