Scala upickle:反序列化期间的字符串值无效
我是scala.js领域的新手,所以我决定在一些小示例上进行尝试,其中一个示例是非常简单的get请求,通过解析将json返回到scala实体中 请在下面查找执行此操作的代码: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
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数字不能代表所有长度”)