2014-07-01 14 views
5

Angesichts der folgenden JSON erstellen ...Spielen: Wie die Felder ohne Wert von JSON zu entfernen und eine neue JSON mit ihnen

{ 
    "field1": "value1", 
    "field2": "", 
    "field3": "value3", 
    "field4": "" 
} 

... wie kann ich zwei verschiedene JSONs bekommen, man die Felder enthält, mit Wert und ein anderer enthält die Felder ohne Wert? Hier unten ist, wie das Endergebnis sollte wie folgt aussehen:

{ 
    "field1": "value1", 
    "field3": "value3" 
} 

{ 
    "field2": "", 
    "field4": "" 
} 
+0

und das Durchschleifen und Erstellen von zwei neuen Objekten reicht nicht aus? – bsoist

Antwort

5

Sie haben Zugriff auf die Felder der JSON-Objekt als eine Folge von (String, JsValue) Paare und Sie können durch sie filtern. Sie können diejenigen mit und ohne Wert herausfiltern und die gefilterten Sequenzen verwenden, um neue JsObject Objekte zu konstruieren.

import play.api.libs.json._ 

val ls = 
    ("field1", JsString("value1")) :: 
    ("field2", JsString("")) :: 
    ("field3", JsString("value3")) :: 
    ("field4", JsString("")) :: 
    Nil 

val js0 = new JsObject(ls) 

def withoutValue(v: JsValue) = v match { 
    case JsNull => true 
    case JsString("") => true 
    case _ => false 
} 

val js1 = JsObject(js0.fields.filterNot(t => withoutValue(t._2))) 
val js2 = JsObject(js0.fields.filter(t => withoutValue(t._2))) 
5

Sie können die @ nietaki-Lösung mithilfe der Partitionsfunktion verbessern.

import play.api.libs.json._ 

val ls = 
    ("field1", JsString("value1")) :: 
    ("field2", JsString("")) :: 
    ("field3", JsString("value3")) :: 
    ("field4", JsString("")) :: 
    Nil 

val js0 = new JsObject(ls) 

def withoutValue(v: JsValue) = v match { 
    case JsNull => true 
    case JsString("") => true 
    case _ => false 
} 

val (js1, js2) = js0.fields.partition(t => withoutValue(t._2)) 
JsObject(js1) 
JsObject(js2) 
Verwandte Themen