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 сериализуется Longs как строки в JSON, потому что числа JavaScript не могут представлять все Longs.

Следовательно created поле вашего объекта должно быть строкой "1474606780004",

Другие вопросы по тегам