2016-04-04 9 views
0

を再生し、私は次のようなJSONオブジェクトに対応するJsValueを持っている(地図、リスト、文字列、のIntなど)、昔ながらのデータにJSONを回すん:は、どのように私はScalaで/

{"foo": [{"id": 1, value: "bar"}, {"id": 2, "value": "baz"}, ...]} 

は、いくつかの簡単な方法はありますこれをMap(String, List(Map(String, Either(String, Int))))またはその他の通常のデータ構造に変換するには?

<anonymous outermost value>["foo"]{"id": 42, "value": "Towel"}が含まれているかどうかをJSONに問い合せたいとします。 JsValueオブジェクトを単純な古いコレクション*に変換できれば、これは簡単です。 JsValueオブジェクトでこれを行うための他の簡単な方法はありますか?

(*)anonymous_outermost_value("foo") contains Map("id" -> Left(42), "value" -> Right("Towel"))のようなものだと思います。 MapListなどと

(つまりものが容易になります場合は、この特定のアプリケーションでは、私は、文字列にすべてのIDを変換し、ちょうどStringEither(String, Int)を回すとOKになります。)

答えて

0

作業がより簡単ではありませんPlayframework Jsonで動作します。 通常の方法でデータを操作する場合は、JSON basicsが役に立ちます。

あなたがコンバータを実装する必要がありますJSON < - >平野JSON Reads[T]を持つオブジェクトとcase class A(id: Long, value: String)case class B(foo: List[A])で表さ{"foo": [{"id": 1, value: "bar"}..で表現例JSONオブジェクト{"id": 1, value: "bar"}についてはWrites[T]

。コンバータJson < - > Plainオブジェクトを実装する最も簡単な方法は、Json.format [T]マクロです。あなたはfooプロパティを抽出し、(単にMap[String, JsValue]のラッパーである)JsObjectにJsValueを変換することができ> JsValue

0

- T <を変換する>Json.fromJson[T](json: JsValue) -

implicit val aFormat = Json.format[A] 
implicit val bFormat = Json.format[A] 

その後、あなたはJson.toJson[T](o: T) <を使用することができますJsArray(これはSeq[JsValue]のラッパー)などとなります。しかし、私はJson関数を使うのが本当に簡単だと思います。

for { 
    foo <- (json \ "foo").validate[Seq[JsObject]] 
    obj <- foo 
    id <- (obj \ "id").validate[Int] 
    value <- (obj \ "value").validate[String] 
    if id == 42 && value == "Towel" 
} { 
    // do something 
}