2013-02-01 56 views
16

Làm cách nào để thay thế giá trị bằng giá trị JSON trong Play?
Mã để minh họa:
Cách thay thế giá trị JSON trong 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

bạn không thao tác chuỗi json. xuống con đường đó là điên khùng. bạn chuyển đổi chuỗi json thành một cấu trúc dữ liệu gốc, điều khiển cấu trúc, sau đó mã hóa lại thành json. –

+0

Giống như MarcB hoặc sử dụng các tính năng Json Coast2Coast http://mandubian.com/2012/10/29/unveiling-play-2-dot-1-json-api-part3-json-transformers/ –

+1

Nếu [câu trả lời của tôi] (http://stackoverflow.com/a/18069519/2643828) hữu ích cho bạn, vui lòng chọn nó làm câu trả lời được chấp nhận. – Zeimyth

Trả lời

2

cái gì đó dọc theo dòng:

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

Bạn không thể cập nhật giá trị tại chỗ vì cấu trúc dữ liệu Play Json là không thay đổi, nhưng bạn có thể tạo một JsValue mới giống hệt với trường được cập nhật. – scalapeno

25

Theo Play Documentation, JsObjects có một phương pháp ++ rằng sẽ hợp nhất hai JsObjects. Vì vậy, khi bạn có giá trị số nguyên mới của bạn, bạn chỉ cần:

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

Như Play 2.1.x bạn có thể sử dụng +:

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

tôi đang xem xét di chuyển ra của tất cả những người bất biến Giải pháp "JSON". Nó chỉ làm cho đoạn mã trở thành một mớ hỗn độn kinh khủng. Đây là cách nó sẽ tìm trong SON of JSON:

import nl.typeset.sonofjson._ 

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

Một cách tiếp cận là, như Marc B nói, chuyển đổi JSON để một cái gì đó giống như một lớp trường hợp, thao tác đó, và sau đó tạo ra một JSON mới.

Tuy nhiên, bạn cũng có thể sử dụng biến 'JSON'. Hiệu quả những gì bạn làm là xây dựng một đối tượng Reads [SomeThing]. Đối tượng này được chuyển đến phương thức chuyển đổi mà bạn gọi trên đối tượng JSON của bạn. Nó sẽ thay đổi đối tượng JSON và trả về một thành công (kết quả) hoặc lỗi (lỗi) trong đó kết quả là JSON được sửa đổi mới. Dưới đây là một (tương đối) rất ví dụ đơn giản:

sử dụng json định dạng sau: {key -> giá trị}

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

Có một hướng dẫn phong nhahere

0

một phiên bản được vinh hiển của Zeimyth của câu trả lời sử dụng chuyển đổi tiềm ẩn

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

sử dụng (json phải loại JsObject và lớp ngầm phải ở trong phạm vi)

json.update("customerId", 1000) 
Các vấn đề liên quan