2015-01-13 11 views
6

Ho questo JSON che viene restituito da un servizio REST che sto usando.Parsing e manipolazione di json in Scala

{ 
    "id": "6804", 
    "signatories": [ 
     { 
      "id": "12125", 
      "fields": [ 
       { 
        "type": "standard", 
        "name": "fstname", 
        "value": "John" 
       }, 
       { 
        "type": "standard", 
        "name": "sndname", 
        "value": "Doe" 
       }, 
       { 
        "type": "standard", 
        "name": "email", 
        "value": "[email protected]" 
       }, 
       { 
        "type": "standard", 
        "name": "sigco", 
        "value": "Company" 
       } 
      ] 
     } 
    ] 
} 

Attualmente sto cercando in un modo per analizzare questo con json4s, l'iterazione di matrice "campi", per essere in grado di cambiare il "valore" di proprietà dei diversi oggetti in là. Finora ho provato alcune librerie json e ho finito con json4s.

Json4s mi consente di analizzare il json in un JObject, che posso provare a estrarre l'array "fields" da.

import org.json4s._ 
    import org.json4s.native.JsonMethods._ 

    // parse to JObject 
    val data = parse(json) 

    // extract the fields into a map 
    val fields = data \ "signatories" \ "fields" 

    // parse back to JSON 
    println(compact(render(fields))) 

sono riuscito ad estrarre una mappa come questo, e reso di nuovo a JSON di nuovo. Ciò che non riesco a capire, però, è come scorrere tra questi campi e modificare il "valore" di proprietà in essi?

Ho letto la documentazione di json4s, ma sono molto nuova sia per Scala che per la sintassi, quindi ho un momento difficile.

La domanda diventa, come si esegue un'iterazione su un risultato JSON analizzato, per modificare il "valore" della proprietà?

Ecco il flusso che voglio raggiungere.

  1. Parse JSON in oggetto iterabile
  2. Loop attraverso e potete trovare alcuni "nomi" e cambiare il loro valore, per esempio fstname, da Giovanni a qualche altro nome.
  3. Analizzalo a JSON, così posso inviare il nuovo JSON con i valori aggiornati.

Non so se questo è il modo migliore per farlo, apprezzerei molto l'input, forse c'è un modo più semplice per farlo.

Grazie in anticipo, i migliori saluti,

Stefan Konno

+0

Qual è la domanda? – Theolodis

+0

"come eseguire il ciclo di questi campi e modificare il" valore "di proprietà in essi?". Modificherò la domanda, per esprimere meglio la domanda, mi dispiace. –

+0

È sempre possibile utilizzare l'operatore \\ senza deserializzare l'oggetto. – bkowalikpl

risposta

6

È possibile convertire il JSON in un array di classe di caso, che è la cosa più facile da fare. Per esempio: si può avere classe caso per i campi come

case class Field(`type`: String, name: String, value: String) 

ed è possibile convertire il vostro JSON in una matrice di campi come read[Array[Field]](json) dove JSON è

[ 
      { 
       "type": "standard", 
       "name": "fstname", 
       "value": "John" 
      }, 
      ... 
     ] 

che vi darà un array di campi. Allo stesso modo, puoi modellare per il tuo intero Json.

Come ora si dispone di una matrice di classi di casi, è piuttosto semplice per iterare gli oggetti e modificare il valore utilizzando il metodo case class copy.

Dopodiché, per convertire l'array di oggetti in Json, è sufficiente utilizzare write(objects) (le funzioni di lettura e scrittura di Json4s sono disponibili nel pacchetto org.json4s.native.Serialization.

Update 

di farlo senza convertirlo in classe caso, è possibile utilizzare la funzione transformField

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))} 
+0

Ok bene, ci provo. Il mio primo piano era usare una Case Class per convertire il mio json. Il json che ho incollato è solo una parte del json che ricevo dal REST, quindi non sono riuscito a creare una case case per 50 campi. Ecco perché ho deciso di analizzare il json con json4s. Posso farlo senza creare classi di casi? –

+0

Non sono sicuro. Proverò dopo un po ', comunque, IMO, è meglio usare una combinazione di classi di casi per costruire una case case più grande, quindi avere una grande struttura come la struttura e Json4s rende piuttosto facile convertire un json in una case class annidata. – mohit

+0

Aggiornamento della risposta – mohit