2016-05-01 11 views
1

は、以下のJSONを考えてみましょ値:プレイFrameworkのJsReadsと

{ 
    "1992": "this is dog", 
    "1883": "test string", 
    "1732": "unknown", 
    "2954": "future year" 
} 

は、どのような方法は、ScalaのケースクラスにこのJSONを変換するためにJSON readsを使用して、ありますか?すなわちSeq[Years]またはMap[String, String]となります。ここでa Yearは年と説明を保持します。参考のため

が、これはあなたが "シンプル" JSON構造のためreadを定義する方法である:

{ 
    "name": "george", 
    "age": 24 
} 

暗黙のJsReads

implicit val dudeReads = (
    (__ \ "name").read[String] and 
    (__ \ "age").read[Int] 
) (Dude) 

答えて

3

Pranavの答え@に似ていますが、より簡潔な:

Json.parse(""" 
    { 
     "1992": "this is dog", 
     "1883": "test string", 
     "1732": "unknown", 
     "2954": "future year" 
    } 
""").as[Map[String, String]] 

利回り

Map[String,String] = Map(1992 -> this is dog, 1883 -> test string, 1732 -> unknown, 2954 -> future year) 

基礎となるReadshereを定義しています。

4

JsValueにあなたのJSON文字列に変換し、その後の検証に使用JsValueオブジェクト

scala> val json: JsValue = Json.parse(""" 
| { 
| "1992": "this is dog", 
| "1883": "test string", 
| "1732": "unknown", 
| "2954": "future year" 
| } 
| """) 
json: play.api.libs.json.JsValue = {"1992":"this is dog","1883":"test string","1732":"unknown","2954":"future year"} 

scala> val valid = json.validate[Map[String,String]] 
valid: play.api.libs.json.JsResult[Map[String,String]] = JsSuccess(Map(1992 -> this is dog, 1883 -> test string, 1732 -> unknown, 2954 -> future year),) 

scala> valid match { 
| case s: JsSuccess[Map[String,String]] => println(s.get) 
| case e: JsError => println("Errors: " + JsError.toJson(e).toString()) 
| } 
Map(1992 -> this is dog, 1883 -> test string, 1732 -> unknown, 2954 -> future year) 
+0

'val result = json.as [Map [String、String]]'と書くだけで、バリデーションとそれに続くマッチをスキップできます。 – Eric

+1

@Ericパスが見つからないか、変換が不可能な場合、asメソッドは 'JsResultException'をスローします。 [ソース](https://www.playframework.com/documentation/2.5.x/ScalaJson#Using-JsValue.as/asOpt) – Pranav