2013-08-22 19 views
5

Ho un caso d'uso in cui devo accettare valori nulli, ma non le proprietà mancanti. Questo è su Play Framework 2.1.3Riproduci Scala Json Missing Property vs Null

Ad esempio:

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

Questa classe caso potrebbe essere parte di una classe di cassa più grande

Vorrei accettare la seguente e generare l'oggetto foo :

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

Ma non questa:

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

Attualmente ho il seguente per leggere il JSON nella classe caso:

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

Come posso fare FooReader generare JsError sulla mancante proprietà, ma consentono nulla?

risposta

5

Si può usare qualcosa di simile a:

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

Il 'Reads.optionNoError [String]' produrrà un JsError se '(__ \ "b")' manca.

Si può effettivamente fare qualcosa di simile:

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

funziona perfettamente per me con:. 'val FooReader = ( (__ \ "a") leggere (Reads.optionNoError [String]) e (__ \ "b"). read (Reads.optionNoError [String]) e (__ \ "c"). read (Reads.optionNoError [String]) ) (Foo) –

+0

Sì, ora funziona per me:) Penso che sia confuso quando provo a costruire Foo all'interno dell'oggetto compagno Foo. Funziona quando imposto esplicitamente l'applicazione –

+0

Ho un caso d'uso in cui un json potrebbe non contenere tutti i campi presenti nell'oggetto originale, e alcuni campi stringa che possono essere 'null' che dovrebbero validare così come impostare i campi obejct originali per nullo. Non sembra essere un modo diretto per farlo. – Ashesh