2013-02-01 61 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

線沿線的東西:

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

按照Play Documentation,JsObjects有一個方法++,將合併兩個JsObjects。所以,當你有你的新的整數值,你只需要:

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

如播放的2.1.x的,你可以使用+

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

一種方法是,如馬克·乙稱,JSON轉換成類似的情況下類,操作這些,然後創建一個新的JSON。

但是,您也可以使用JSON'變形金剛'。實際上你要做的是構建一個Reads [SomeThing]對象。這個對象被傳遞給你在你的JSON對象上調用的transform方法。它將更改JSON對象並返回成功(結果)或失敗(錯誤),其中結果是新的已修改JSON。這裏的一個(比較)非常簡單的例子:

使用格式的JSON:{鍵 - >值}

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

有一個體面導向here

0

的美化了版本Zeimyth的使用隱式轉換的答案

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

使用(JSON的類型必須爲JsObject的和隱含的類應該在範圍內)

json.update("customerId", 1000)