2016-04-25 4 views
2

私はスカラを学んでいます。 JSON StringをScalaのcaseクラスインスタンスにチューニングする簡単な方法を探しています。 JavaにはGoogle Gsonという素晴らしいライブラリがあります。それは、いくつかの特別なコーディングなしでJava Beanをjsonに戻すことができます。基本的には、コードの1行で行うことができます。スカンソンのGsonのようなライブラリ

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) 

私はおよそhttps://www.playframework.com/documentation/2.5.x/ScalaJsonを読んでいるとアイデアを得ることができない。それは非常に複雑である理由は、Scalaのでしょうか?単純なケースクラスのインスタンスをシリアライズ/デシリアライズするために読者/ライターを書く必要があるのはなぜですか? play json apiを使用して、caseクラスのインスタンス - > json - > caseクラスのインスタンスを簡単に変換する方法はありますか?

+0

ジャクソンは... – Dima

答えて

3

はあなたがあなたが簡単に

implicit val fooFormat = Json.format[Foo] 
を行うことによってプレイで、このため formatterを書くことができます

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

を持っているとしましょう

これにより、JSONにシリアライズとデシリアライズの両方を行うことができます。

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は汎用コードでJSONにどのような場合でもクラスを変換するすべての標準的なコレクションとケースクラスのためにかなりうまく機能 'DefaultScalaModule'を持っています。上記の場合、それぞれのケースクラス(たとえば124モデル)のフォーマッタを記述する必要があり、125番目があるかどうかわからないジェネリックコードでは機能しません。長い生きているGson。 build.sbtに 'libraryDependencies + =" com.google.code.gson "%" gson "%" 2.8.0 "'を追加するだけです。 – JulienD

+0

Playフレームワークを使用している場合、 'writes'インスタンスが定義されていないコントローラで' JsValue'を送信しようとすると、コードはコンパイルされません。 GSONはすべてランタイムであり、ネイティブのScala型( 'Option'、' scala.collection.immutable.Map'など)についても知らないため、これらのためのシリアライザの手作業を必要とします。 – nattyddubbs

1

uPickle

をチェックアウトはここで小さな例です:

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

val ex = Example("Hello", 3) 

write(ex) // { "firstField": "Hello", "secondIntField" : 3 } 
関連する問題