2016-06-07 15 views
0

Ich bin ganz neu in scala.js Welt, damit ich es heraus auf einige kleine Beispiele versuchen entschieden und einer von ihnen ist ganz einfach get Anfrage mit Parsen von JSON zurück in scala Einheit zurückkehrt.upickle: ungültige Zeichenfolge-Wert während der Deserialisierung

Bitte Code finden, die unten abgebildet,:

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) gibt die folgende json:

[ 
    { 
    "title": "Some fancy title", 
    "content": "some very long string with \"escaped\" characters", 
    "tags": [ 
     "algorithms" 
    ], 
    "created": 1474606780004 
    } 
] 

Und wenn alles kommt auf die

read[List[Post]](stringify) 

ich erhalte die folgende Ausnahme:

upickle.Invalid$Data: String (data: 1474606780004) 

Die Frage ist also: ist alles da, dass ist falsch gemacht? Gibt es einen berechtigten Grund für ein solches Verhalten?

Version der Bibliothek verwendet:

"com.lihaoyi" %%% "upickle" % "0.4.1" 

EDIT:

Unternehmen selbst hinzu:

case class Post(title: String, 
        content: String, 
        tags: List[String] = List.empty, 
        created: Long = System.currentTimeMillis()) 

EDIT 2:

Der folgende Code erzeugt den gleichen Fehler:

val post = Post("Some title", "some \"content\"", List("algorithms"), 1474606780004L) 
val json = write[List[Post]](List(post)) 

Vielen Dank im Voraus für die Klarstellung.

+0

Ich glaube upickle 'Long's als JSON-Strings serialisiert. Versuchen Sie, 'write' auf der manuell instanziierten Liste von Posts aufzurufen und vergleichen Sie die Ausgabe mit Ihrer' stringify' Zeichenkette. –

+1

Als Alternative: Kann man 'readJs' anstelle von' read' aufrufen, statt 'stringify'' data' übergeben? –

+0

Ändern Rückruf Signatur zu Daten: Js.Value und readJs Methode führt diese Ausnahme Aufruf: scala.scalajs.runtime.UndefinedBehaviorError: Ein undefiniertes Verhalten festgestellt wurde: [object Object], [object Object], [object Object], [object Object ], [Objekt Objekt] ist keine Instanz von Uptickle.Js $ Value – tkachuko

Antwort

2

Nun, eigentlich die richtige Antwort stellte sich heraus, hier zu sein: upickle read from scalaJS - upickle.Invalid$Data: String (data: 1)

String Antwort nur teilweise richtig ist. Sie können auch Doppel (mindestens Sie erhalten kostenlose Umwandlung von tatsächlichen lang kostenlos auf scala Seite) verwenden.

So landete ich mit der folgenden Einheit auf, die ganz gut funktioniert:

case class Post(title: String, 
        content: String, 
        tags: List[String] = List.empty, 
        created: Double = System.currentTimeMillis()) 
0

uPickle serialisiert s als Zeichenfolgen in JSON, da JavaScript-Nummern nicht alle s darstellen können.

Daher sollte das Feld created Ihres Objekts die Zeichenfolge"1474606780004" sein.

+0

Danke für Ihre Antwort. Für mich ist 'created' nur ein Zeitstempel. Wird uPickle in der Lage sein, LocalDateTime von der Java 8 Date/Time API zu verarbeiten? – tkachuko

+0

Auch von uPickle Website: Out of the Box unterstützt uPickle Schreiben und Lesen der folgenden Typen: Boolean, Byte, Char, Kurz, Int, ** Long **, Float, Double. Warum passiert es dann, dass die Bibliothek nicht in der Lage ist, mit einer Fallklasse zu arbeiten, die ein 'Long'-Feld hat? – tkachuko

+0

"uPickle serialisiert Longs als Zeichenfolgen in JSON", - nicht wahr. 'write [List [Post]] (List (post))' erzeugt die gleiche Ausnahme, also würde ich besser sagen, dass es überhaupt nicht mit 'Long' funktioniert. – tkachuko

Verwandte Themen