upickle: неверное строковое значение во время десериализации
Я довольно новичок в мире 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)
}
)
}
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))
Заранее спасибо за разъяснения.
2 ответа
Ну, на самом деле правильный ответ оказался здесь: upickle, прочитанный из scalaJS - upickle.Invalid$Data: String (data: 1)
Строка только частично правильный ответ. Вы также можете использовать Double (по крайней мере, вы получаете бесплатную конвертацию из реальной длины бесплатно на стороне Scala).
Итак, я получил следующую сущность, которая прекрасно работает:
case class Post(title: String,
content: String,
tags: List[String] = List.empty,
created: Double = System.currentTimeMillis())
uPickle сериализуется Long
s как строки в JSON, потому что числа JavaScript не могут представлять все Long
s.
Следовательно created
поле вашего объекта должно быть строкой "1474606780004"
,