2012-04-04 8 views
5

私は両方のプレイに新しい! &スカラですが、JSONリクエストをMap [String、JsObject](またはMap [String、JsValue]、私はその区別についてはわかりません)にマップし、リストを出力するサービスを作ろうとしています(好ましくはツリーとして)キーを再帰的に使用することができる。[String、JsObject]をPlay 2.0でマップするJSON?

しかし、私はスタートの問題を抱えている:

def genericJSONResponse = Action(parse.json) { 
    request => request.body 
    var keys = request.keys 
    Ok("OK") 
} 

私はここに期待する何が要求からキーで充填するキーのためだったが、もちろん、それはコンパイルされません。どのように私はこれに近づくべきですか?

ニック

+0

このwikiはあなたが読んでいますか? https://github.com/playframework/Play20/wiki/ScalaJsonRequests キーを手動でマッピングするか暗黙のオブジェクトを使用してオブジェクトにマッピングする必要があります。 https://github.com/playframework/Play20/wiki/ScalaJsonGenerics –

答えて

14

JsValueは、すべてのJSON値の基本クラスです:-) Scalaのnoobのを手伝うために、事前に

感謝。 JsObjectJsValueのサブタイプである(JsNull,JsUndefined,JsBoolean,JsNumber,JsStringおよびJsArray)。それは不明だ場合はJSONの仕様を見てみましょう:http://json.org/

あなたは身体のリクエストでJSONは、JSONオブジェクト(上記の他のタイプではなく)あなたがそれをパターン一致させることが可能であることが分かっている場合:

def genericJSONResponse = Action(parse.json) { request => 
    request.body match { 
    case JsObject(fields) => Ok("received object:" + fields.toMap + '\n') 
    case _ => Ok("received something else: " + request.body + '\n') 
    } 
} 

fields.toMapはあなたが望むタイプです:Map[(String, JsValue)]mapまたはcollectを使用してオブジェクトのキーを再帰的に処理することができます。 (ちなみに、Seq[(String, JsValue)]であり、mapcollectもサポートしているので、fieldsを直接使用することができます)。

+1

ありがとう、それは美しく働いた。 :-) – niklassaers

+0

@niklassaers私はあなたがそれを好きでうれしいです。 – romusz