2017-02-17 2 views
0

Ich muss Case-Class-Objekt mit Feld "name" aus JSON serialisieren und dann deserialisieren, die "animalname" Feld statt "name" hat. Serialisierung funktioniert ok, aber Deserialisierung nicht. Ich benutzte FieldSerializer mit renameTo() und renameFrom():json4s: JSON mit dem umbenannten Feld nicht analysieren

import org.json4s._ 
import org.json4s.FieldSerializer._ 
import org.json4s.jackson.Serialization._ 

case class WildDog(name: String) 
val dogSerializer = FieldSerializer[WildDog](
    renameTo("name", "animalname"), 
    renameFrom("animalname", "name")) 
implicit val formats = DefaultFormats + dogSerializer 
// serialize 
val json = write(WildDog("beefy")) // {"animalname":"beefy"}, as expected 
// try to deserialize 
val dog = parse(json).extract[WildDog] // expected: Dog("beefy") 

Eigentlich extract() wirft Ausnahme:

org.json4s.package$MappingException: No usable value for name 
Did not find value which can be converted into java.lang.String 
    at org.json4s.reflect.package$.fail(ws.sc:94) 
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(ws.sc:409) 
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(ws.sc:417) 
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(ws.sc:417) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(ws.sc:240) 
    at scala.collection.TraversableLike$$anonfun$map$1.apply(ws.sc:240) 
    at scala.collection.mutable.ResizableArray$class.foreach(ws.sc:55) 
    at scala.collection.mutable.ArrayBuffer.foreach(ws.sc:43) 
    at scala.collection.TraversableLike$class.map(ws.sc:240) 
    at scala.collection.AbstractTraversable.map(ws.sc:101) 
    at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$instantiate(ws.sc:417) 
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(ws.sc:445) 
    at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(ws.sc:442) 
    at org.json4s.Extraction$.org$json4s$Extraction$$customOrElse(ws.sc:454) 
    at org.json4s.Extraction$ClassInstanceBuilder.result(ws.sc:442) 
    at org.json4s.Extraction$.extract(ws.sc:304) 
    at org.json4s.Extraction$.extract(ws.sc:38) 
    at org.json4s.ExtractableJsonAstNode.extract(ws.sc:17) 

Wie dieses JSON korrekt deserialisiert?

Update: Ich benutze Scala 2.10, json4s 3.2.5.

Update 2: Ich benutze diese Maven Abhängigkeit für json4s:

<dependency> 
    <groupId>org.json4s</groupId> 
    <artifactId>json4s-jackson_2.10</artifactId> 
    <version>3.2.5</version> 
</dependency> 

Antwort

1

versuchen val dog = read[WildDog](json) statt val dog = parse(json).extract[WildDog]

Die Github Seite - https://github.com/json4s/json4s hat einige andere auch gute Beispiele.

Edit:

Arbeits Versionen:
Scala 2.10 & & org.json4s.jackson> = 3.5.0
Scala 2.11 & & org.json4s.jackson> = 3.2.5

Ich habe keine früheren Versionen für Scala 2.10 überprüft, aber die Ausnahme existiert, wenn ich 3.2.5 verwende.

Auch ich bin in der Lage val dog = parse(json).extract[WildDog] zur Arbeit zu kommen, aber Sie müssen das importieren JsonMethods ->import org.json4s.jackson.JsonMethods.parse

+0

versucht, gleiche MappingException :( –

+1

Welche scala-Version Sie verwenden Ich bin in der Lage, es zu bekommen, mit zu arbeiten? 2.11 statt 2.10 – pjames

+0

Ich benutze Scala 2.10, json4s 3.2.5 Ich schätze, ich werde keine Gelegenheit haben, jetzt zu 2.11 zu wechseln ... –

Verwandte Themen