2013-04-14 28 views
7

Tôi đang sử dụng các bản đọc JSON 2.1 của Play để đạt được chuyển đổi có điều kiện.Phát biến áp tùy chọn JSON

Tôi có đối tượng json và tôi muốn chuyển đổi trường tùy chọn xóa \ n ký tự. Vấn đề là nếu tôi xóa nội dung khỏi JSON đã gửi, tôi sẽ gặp lỗi xác thực.

Trường này là tùy chọn và tôi không biết cách mô tả rằng phép chuyển đổi là tùy chọn. Đây là chuyển đổi nội dung hiện tại:

 val transformContent = (__ \ 'content).json.update(__.read[JsString].map{ 
     value => 
     JsString(value.value.replaceAll("\n", "")) 
    }) 

Làm cách nào để có được phép chuyển đổi trường tùy chọn? Tôi có nên sử dụng số Reads.verifyingIf không?

Cảm ơn

Trả lời

8

Bạn có thể làm điều này:

val json = Json.obj("whatever" -> 1, "content" -> "hello world") 
val json2 = Json.obj("whatever" -> 1) 

val transformer = (__ \ 'content).json.update(
    __.readOpt[JsString].map{ 
    case Some(JsString(str)) => JsString(str.replaceAll("world", "scala")) 
    } 
).orElse(__.json.pick[JsObject]) 

json.transform(transformer) 
//JsSuccess({"whatever":1,"content":"hello scala"},) 
json2.transform(transformer) 
//JsSuccess({"whatever":1},) 

ít hacky, nhưng nó hoạt động.

+1

'readOpt' không được dùng nữa (Kể từ phiên bản 2.1-RC2) sử dụng' readNullable [T] 'thay thế (quản lý cả trường bị thiếu và rỗng) – HEX

2

Một vài năm sau, tôi đã phải thay đổi một số điều cần làm cho nó hoạt:

val json = Json.obj("whatever" -> 1, "content" -> "hello world") 
val json2 = Json.obj("whatever" -> 1) 

val transformer = (__ \ 'content).json.update(
    __.read[JsString].map { 
    case JsString(str) => JsString(str.replaceAll("world", "scala")) 
    } 
).orElse(__.json.pick[JsObject]) 

json.transform(transformer) 
//JsSuccess({"whatever":1,"content":"hello scala"},) 
json2.transform(transformer) 
//JsSuccess({"whatever":1},) 

Các đọc thất bại nếu chuỗi không có mặt, do đó phương pháp OrElse Handels các JsError.

Các vấn đề liên quan