2013-08-22 21 views
5

Mam przypadek użycia, w którym muszę zaakceptować wartości null, ale nie brakujące właściwości. Jest w Play Framework 2.1.3Zagraj w Scala Json Missing Property vs Null

Na przykład:

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

Klasa ta sprawa może być częścią większej klasie przypadku

chciałbym przyjąć następujące i wygenerować obiekt foo :

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

Ale nie to:

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

Obecnie mam następujący czytać JSON do klasy obudowy:

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

Jak mogę dokonać FooReader generować JsError na brak właściwości, ale pozwalają NULL?

Odpowiedz

5

Można użyć coś takiego:

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

The 'Reads.optionNoError [łańcuch]' będzie produkować JsError if '(__ \ "b")' brakuje.

można faktycznie zrobić coś takiego:

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

działa idealnie dla mnie. 'val FooReader = ( (__ \ "a"), read (Reads.optionNoError [String]) i (__ \ "b"). read (Reads.optionNoError [String]) i (__ \ "c"). read (Reads.optionNoError [String]) ) (Foo) ' –

+0

Tak, teraz to działa dla mnie:) Myślę, że to pomieszało kiedy próbowałem zbudować Foo wewnątrz obiektu towarzyszącego Foo. Działa, gdy ustawiam jawnie aplikację –

+0

Mam przypadek użycia, w którym json może nie zawierać wszystkich pól obecnych w oryginalnym obiekcie, a niektóre pola łańcuchowe mogą mieć wartość "null", które powinny sprawdzać poprawność oraz ustawić pola oryginalnego obejścia zero. Nie wydaje się, że jest to bezpośredni sposób. – Ashesh