2016-04-25 6 views
2

Ich lerne scala. Ich versuche, einen einfachen Weg zu finden, um JSON String zu einer Scala-Fallklasseninstanz zu machen. Java hat eine wunderbare Bibliothek namens Google Gson. Es kann Java-Beans zu json und zurück ohne irgendeine spezielle Kodierung drehen, im Grunde können Sie es in einer einzelnen Linie des Codes tun.Gson-like-Bibliothek für scala

public class Example{ 
    private String firstField 
    private Integer secondIntField 

    //constructor 

    //getters/setters here 
} 
//Bean instance to Json string 
String exampleAsJson = new Gson().toJson(new Example("hehe", 42)) 

//String to Bean instance 
Example exampleFromJson = new Gson().fromJson(exampleAsJson, Example.class) 

Ich lese über https://www.playframework.com/documentation/2.5.x/ScalaJson und kann nicht auf die Idee kommen: warum es so komplex ist, ist scala? Warum sollte ich Leser/Schreiber schreiben, um reine einfache Fallklasseninstanzen serialisieren/deserialisieren zu können? Gibt es eine einfache Möglichkeit, die Fallklasseninstanz -> json -> Fallklasseninstanz mit play json api zu konvertieren?

+0

Jackson hat einen 'DefaultScalaModule', die für alle Standard-Sammlungen und Fallklassen funktioniert ziemlich gut ... – Dima

Antwort

3

Angenommen, Sie haben

case class Foo(a: String, b: String) 

Sie können ganz einfach ein formatter für diese in Play schreiben von

implicit val fooFormat = Json.format[Foo] 
tun

Damit können Sie JSON sowohl serialisieren als auch deserialisieren.

val foo = Foo("1","2") 
val js = Json.toJson(foo)(fooFormat) // Only include the specific format if it's not in scope. 
val fooBack = js.as[Foo]    // Now you have foo back! 
+0

Gson wird jeden Fall Klasse Json in generischen Code umwandeln. Das oben Gesagte erfordert, dass Sie einen Formatierer für jede Ihrer Fallklassen schreiben (ich habe zum Beispiel 124 Modelle) und werde nicht für generischen Code arbeiten, der nicht weiß, ob es einen 125sten gibt. Lang lebe Gson. Fügen Sie einfach 'libraryDependencies + =" com.google.code.gson "%" gson "%" 2.8.0 "' zu build.sbt hinzu. – JulienD

+0

Wenn Sie das Play-Framework verwenden, wird der Code nicht kompiliert, wenn Sie versuchen, einen 'JsValue' in einem Controller zu senden, für den keine 'writes'-Instanz definiert ist. GSON ist alles Laufzeit und weiß auch nichts über native Scala-Typen ('Option',' scala.collection.immutable.Map', usw.), für die Sie Serializer von Hand schreiben müssen. – nattyddubbs

1

Check out uPickle

Hier ist ein kleines Beispiel:

case class Example(firstField: String, secondIntField: Int) 

val ex = Example("Hello", 3) 

write(ex) // { "firstField": "Hello", "secondIntField" : 3 }