2017-11-22 15 views
0

我々はScalaでこの例を見つけた場合、入力JSONから枝を剪定JSONドキュメント再生:私は条件に枝を剪定するにはどうすればよい https://www.playframework.com/documentation/2.6.x/ScalaJsonTransformersスカラ、JSONの変圧器を再生する条件

// Case 6: Prune a branch from input JSON 
val jsonTransformer = (__ \ 'key2 \ 'key22).json.prune 
json.transform(jsonTransformer) 

を?たとえば、key22の値が空の文字列の場合は、key22ブランチをプルーニングしますか?

答えて

1

これを行うための組み込みの方法はわかりませんが、自分で作成することはできます。

私たちにはパスがあります。値を調べるリーダーが必要です。条件を満たす場合は、パスをプルーニングしてください。

したがって、パスを選択することで値を読み取ることができます。値をとってフラットなマップを作成し、テストが真であれば、刈り込みされたリーダーを返します。そうでなければ値を刈り込みたくないので、パススルーリーダーを返します。

結果は、私たちが望むことをするリーダーです。

val jsonTrue = Json.parse("""{ "key2" : { "key22" : true } }""") 
val jsonFalse = Json.parse("""{ "key2" : { "key22" : false } }""") 

val jsonTransformer = pruneIf(__ \ 'key2 \ 'key22)(_ == JsFalse) 
jsonTrue.transform(jsonTransformer) // JsSuccess({"key2":{"key22":true}},) 
jsonFalse.transform(jsonTransformer) // JsSuccess({"key2":{}},/key2/key22) 
:私たちを与える

def pruneIf(path: JsPath)(test: (JsValue => Boolean)): Reads[JsValue] = 
    path.json.pick.flatMap(value => 
    if (test(value)) path.json.prune.map(identity) else __.json.pick) 

関連する問題