2013-02-01 9 views
16

PlayのJSON値の値を置き換えるにはどうすればよいですか?例示する
コード:
PlayのJSON値を置き換える方法

def newReport() = Action(parse.json) { request => 
    var json = request.body 
    if((json \ "customerId").as[Int] == -1){ 
     // replace customerId after some logic to find the new value 
    } 
    json.validate[Report](Reports.readsWithoutUser).map { 
     case _: Report => 
+4

あなたはJSON形式の文字列を操作しないでください。その道は狂っている。 json文字列をネイティブのデータ構造に変換し、構造を操作してからjsonに再エンコードします。 –

+0

MarcBのように、またはJson Coast2Coastの機能を使用するhttp://mandubian.com/2012/10/29/unveiling-play-2-dot-1-json-api-part3-json-transformers/ –

+1

[私の答え]( http://stackoverflow.com/a/18069519/2643828)が役に立ちました。それを受け入れられる回答として選択してください。 – Zeimyth

答えて

2

の線に沿って何か:Play Documentationによれば

val updatedJson = if((request.body \ "customerId").as[Int] == -1){ 
    val newId = JsObject(Seq(("customerId",JsString("ID12345")))) 
    (request.body ++ newId).as[JsValue] 
} else request.body 

updatedJson.validate[Report](Reports.readsWithoutUser).map { 
    case _: Report => 
+0

Play Jsonデータ構造が不変なので、値を更新することはできませんが、更新されたフィールドを除いて同じ新しいJsValueを作成することができます。 – scalapeno

25

、JsObjectsは、二つJsObjectsをマージするメソッド++を有します。あなたの新しい整数値を持っているときに、あなたは単に必要がありますプレイ2.1.Xのよう

val updatedJson = json.as[JsObject] ++ Json.obj("customerId" -> newValue) 

をご+を使用することができます。

val updatedJson = json.as[JsObject] + ("customerId" -> newValue) 
1

私は離れ不変それらのすべての移行を検討しています"JSON"ソリューションコードをひどく混乱させているだけです。これは、SON of JSONにどのように見えるかです:

import nl.typeset.sonofjson._ 

val json = … 
if (json.customerId.as[Int] == -1) { 
    json.customerId = 987938 
} 
2

一つのアプローチであり、マークBが言うように、それを操作し、ケースクラスのようなものをJSONに変換し、新しいJSONを作成します。

ただし、JSONの「変圧器」を使用することもできます。効果的には、Reads [SomeThing]オブジェクトを構築することです。このオブジェクトは、JSONオブジェクトで呼び出すtransformメソッドに渡されます。 JSONオブジェクトが変更され、success(結果)またはfailure(エラー)が返されます。ここでresultは新しい変更されたJSONです。フォーマットのJSONを使用

:ここで(比較的)非常に単純な例の{キー - >値}

def jsonXForm(value: String) = (__ \ "customerId").json.update(
    (__ \ "customerId").json.put(JsString(value)) 
) 
json.transform(jsonXForm(yourNewValue)) match {...}` 

がZeimythのまともガイドhere

0

の見せかけバージョンあり暗黙の変換を使用する答え

implicit class JsObjectEnhancer(jsObject: JsObject) { 
    def update(args: (String, Json.JsValueWrapper)*): JsObject = { 
    jsObject ++ Json.obj(args: _*) 
    } 
} 

使い方(JSONはJSObject型でなければならず、暗黙のクラスがスコープにする必要があります)

json.update("customerId", 1000) 
関連する問題