upickle:反序列化期间无效的字符串值
upickle: invalid string value during deserialization
我是 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) returns 以下 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.
因此,您的对象的 created
字段应该是 string "1474606780004"
.
嗯,原来正确答案在这里:
String 只是部分正确的答案。您还可以使用 Double(至少您可以 在 scala 端免费从实际 long 免费转换 )。
所以我最终得到了以下运行良好的实体:
case class Post(title: String,
content: String,
tags: List[String] = List.empty,
created: Double = System.currentTimeMillis())
我是 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) returns 以下 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.
因此,您的对象的 created
字段应该是 string "1474606780004"
.
嗯,原来正确答案在这里:
String 只是部分正确的答案。您还可以使用 Double(至少您可以 在 scala 端免费从实际 long 免费转换 )。
所以我最终得到了以下运行良好的实体:
case class Post(title: String,
content: String,
tags: List[String] = List.empty,
created: Double = System.currentTimeMillis())