5

Ich habe einen Anwendungsfall, in dem ich Nullwerte, aber nicht fehlende Eigenschaften akzeptieren muss. Dies ist auf Play-Framework 2.1.3Spielen Scala Json Missing Property vs Null

Zum Beispiel:

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

Dieser Fall Klasse Teil einer größeren Fallklasse könnte

Ich mag würde folgend und erzeugen das foo-Objekt akzeptieren :

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

Aber nicht dies:

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

Derzeit ist die folgende, um die JSON in dem Fall, Klasse habe ich gelesen habe:

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

Wie kann ich FooReader erzeugen JsError auf fehlende Eigenschaft machen, aber null zulassen?

Antwort

5

können Sie so etwas wie verwenden:

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

The 'Reads.optionNoError [Zeichenfolge]' wird ein JsError wenn '(__ \ "b")' erzeugen fehlt.

Sie tatsächlich so etwas wie tun:

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

funktioniert perfekt für mich. 'val FooReader = ( (__ \ "a") lesen (Reads.optionNoError [String]) und (__ \ "b"). read (Reads.optionNoError [String]) und (__ \ "c"). read (Reads.optionNoError [String]) ) (Foo) ' –

+0

Ja, es funktioniert jetzt für mich:) Ich denke, dass es verwirrt wurde, wenn ich Foo innerhalb des Begleitobjekts Foo bauen wollte. Es funktioniert, wenn ich die Anwendung explizit –

+0

Ich habe einen Anwendungsfall, wo ein JSON möglicherweise nicht alle Felder im ursprünglichen Objekt enthalten, und einige Zeichenfolge Felder, die 'null' sein kann, die validieren sowie die ursprünglichen obejct Felder festlegen soll Null. Es scheint keinen direkten Weg zu geben, dies zu tun. – Ashesh