2014-09-02 2 views
1

вопрос не специфичен для JsValue, его для всех неизменяемых объектов в scala, которые я хочу отредактировать, и сохранить остальные как есть. , например, у меня есть этот объект:scala play - редактировать JsValue с вложенными JsValues ​​

"references": { 
    "hsId": "37395615-244b-4706-b6f5-237272f07140", 
    "others": { 
     "path": "rewr", 
     "externalId": "ewr", 
     "version": "2" 
    } 
} 

и позволяет сказать, что я просто хочу, чтобы изменить версию.

благодаря

ответ

1

хорошо я понял, способ решения, , но я чувствую сво патч и не лучший ответ

val references: JsObject = (json \ "references").as[JsObject] 
val newVersion = JsObject(List(("others", JsObject(List(("version", JsString("3")))).as[JsValue]))) 
val newReferences = references.deepMerge(newVersion) 
1

Вы можете использовать JSON transformers. Предположим, мы хотим изменить версию на "3".

val js: JsValue = Json.parse(""" 
    { 
     "references": { 
      "hsId": "37395615-244b-4706-b6f5-237272f07140", 
      "others": { 
       "path": "rewr", 
       "externalId": "ewr", 
       "version": "2" 
      } 
     } 
    } 
""") 

// Define the transformer 
val transformer = (__ \ "references" \ "others").json.update(
    __.read[JsObject].map{o => o ++ Json.obj("version" -> "3")} 
) 

val newJs = js.transform(transformer) 

Это будет копировать весь объект, а затем заменить version на others отрасли.

Смежные вопросы