2013-02-01 14 views
16

Jak zastąpić wartość w wartości JSON w grze?
kod zilustrować:
Jak zamienić wartość JSON w Play

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

nie manipulować ciągi JSON. w dół tej drogi leży szaleństwo. konwertujesz ciąg json do natywnej struktury danych, manipulujesz strukturą, a następnie ponownie kodujesz do json. –

+0

Podobnie jak MarcB lub użyj funkcji Json Coast2Coast http://mandubian.com/2012/10/29/unveiling-play-2-dot-1-json-api-part3-json-transformers/ –

+1

Jeśli [moja odpowiedź] (http://stackoverflow.com/a/18069519/2643828) był dla ciebie pomocny, wybierz go jako zaakceptowaną odpowiedź. – Zeimyth

Odpowiedz

2

coś na wzór:

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

Nie można zaktualizować wartości, ponieważ struktury danych Json Play są niezmienne, ale można utworzyć nową wartość JsValue, która jest identyczna z wyjątkiem zaktualizowanego pola. – scalapeno

25

Według Play Documentation, JsObjects jest metoda ++ które łączenia dwóch JsObjects. Tak więc, gdy masz nową wartość całkowitą, wystarczy:

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

Jak zaawansowania 2.1.x można użyć +:

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

Zastanawiam oddala się od tych wszystkich, niezmienne Rozwiązania "JSON". To sprawia, że ​​kod to straszny bałagan. To jak to będzie wyglądać w SON of JSON:

import nl.typeset.sonofjson._ 

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

Jednym ze sposobów jest, jak mówi Marc B, konwertować JSON do czegoś podobnego klasy przypadek, że manipulować, a następnie utworzyć nową JSON.

Można jednak użyć również transformatorów JSON. Skutecznie to, co robisz, to zbudowanie obiektu Reads [SomeThing]. Ten obiekt jest przekazywany do metody transformacji, którą wywołujesz na swoim obiekcie JSON. Zmieni obiekt JSON i zwróci wynik (wynik) lub niepowodzenie (błąd), gdzie wynikiem jest nowy zmodyfikowany JSON. Oto (stosunkowo) bardzo prosty przykład:

za pomocą JSON formacie: {key -> wartość}

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

Jest przyzwoity przewodnik here

0

uwielbiony wersja Zeimyth użytkownika odpowiedź, która używa niejawnej konwersji:

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

Wykorzystanie (json musi być typu JSObject i niejawna klasa powinna być w zakresie)

json.update("customerId", 1000)