0

我在 scala.js 世界中很新,所以我决定尝试一些小例子,其中一个是非常简单的获取请求,将返回的 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)
    }
  )
}

console.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))

提前感谢您的澄清。

4

2 回答 2

2

好吧,实际上正确的答案竟然在这里:upickle read from scalaJS - upickle.Invalid$Data: String (data: 1)

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

所以我最终得到了以下可以正常工作的实体:

case class Post(title: String,
                  content: String,
                  tags: List[String] = List.empty,
                  created: Double = System.currentTimeMillis())
于 2016-06-09T01:42:55.533 回答
0

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

因此,created您的对象的字段应该是string "1474606780004"

于 2016-06-08T19:17:02.987 回答