2013-08-22 33 views
5

Tôi có một trường hợp sử dụng mà tôi cần phải chấp nhận giá trị null, nhưng không thiếu tài sản. Đây là trên Play, Khung 2.1.3Chơi Scala Json Thiếu tài sản vs Null

Ví dụ:

case class Foo(a: Option[String], b: Option[String], c: Option[String]) 

lớp Trường hợp này có thể là một phần của một lớp học trường hợp lớn hơn

tôi muốn chấp nhận những điều sau và tạo ra các đối tượng foo :

{ 
    "foo" : { 
     "a" : "blah", 
     "b" : null, 
     "c" : "blah" 
    } 
} 

Nhưng không này:

{ 
    "foo" : { 
     "a" : "blah", 
     "c" : "blah" 
    } 
} 

Hiện nay tôi có sau đây để đọc các JSON vào lớp trường hợp:

val FooReader = (
    (__ \ "a").readNullable[Setting] and 
    (__ \ "b").readNullable[String] and 
    (__ \ "c").readNullable[String])(Foo) 

Làm thế nào tôi có thể làm cho FooReader tạo JsError trên thiếu tài sản nhưng cho phép null?

Trả lời

5

Bạn có thể sử dụng một cái gì đó như:

val FooReader = (
    (__ \ "a").readNullable[String] and 
    (__ \ "b").read(Reads.optionNoError[String]) and 
    (__ \ "c").readNullable[String] 
)(Foo) 

Các 'Reads.optionNoError [Chuỗi]' sẽ tạo ra một JsError nếu '(__ \ "b")' là mất tích.

Bạn thực sự có thể làm điều gì đó như:

val FooReader = (
    (__ \ "a").read(Reads.optionNoError[String]) and 
    (__ \ "b").read(Reads.optionNoError[String]) and 
    (__ \ "c").read(Reads.optionNoError[String]) 
)(Foo) 
+0

trình hoàn hảo cho tôi với:. 'val FooReader = ( (__ \ "a") đọc (Reads.optionNoError [Chuỗi]) và (__ \ "b") đọc (Reads.optionNoError [String]) và (__ \ "c") đọc (Reads.optionNoError [String]) ) (Foo) ' –

+0

Yea, nó hoạt động cho tôi bây giờ: Tôi nghĩ rằng nó đã bị lẫn lộn khi tôi cố gắng xây dựng Foo bên trong đối tượng đồng hành Foo. Nó hoạt động khi tôi đặt áp dụng một cách rõ ràng –

+0

Tôi có một trường hợp sử dụng nơi một json có thể không chứa tất cả các trường có trong đối tượng ban đầu, và một số trường chuỗi có thể là 'null', nó sẽ xác nhận cũng như thiết lập các trường obejct gốc vô giá trị. Có vẻ như không phải là cách trực tiếp để thực hiện điều đó. – Ashesh