2014-07-01 11 views
5

Dato il seguente JSON ...Giocare: Come rimuovere i campi senza valore da JSON e creare un nuovo JSON con loro

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

... come faccio a due JSONs distinti, uno contenente i campi con valore e un altro contenente i campi senza valore? Di seguito è come il risultato finale dovrebbe essere simile:

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

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

e non è sufficiente eseguire il ciclo e creare due nuovi oggetti? – bsoist

risposta

5

Si ha accesso ai campi degli oggetti JSON come una sequenza di coppie (String, JsValue) ed è possibile filtrare attraverso di loro. È possibile filtrare quelli con e senza valore e utilizzare le sequenze filtrate per costruire nuovi oggetti JsObject.

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

È possibile migliorare la soluzione di @nietaki utilizzando la funzione di partizione.

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) 
Problemi correlati