Sto sperimentando con la libreria di json4s (basata su lift-json). Una delle cose che vorrei fare è analizzare una stringa JSON in un AST e quindi manipolarla.Come manipolare JSON AST in Scala
Per esempio, vorrei spostare un campo (inserire il campo nell'AST se non esiste o aggiornare il suo valore se lo fa).
Non sono stato in grado di trovare come farlo nella documentazione. Sperimentando con i metodi disponibili, ho trovato il seguente, che funziona, ma si sente goffo.
import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.native.JsonMethods._
object TestJson {
implicit val formats = DefaultFormats
def main(args: Array[String]): Unit = {
val json = """{"foo":1, "bar":{"foo":2}}"""
val ast = parse(json).asInstanceOf[JObject]
println(upsertField(ast, ("foo" -> "3")))
println(upsertField(ast, ("foobar" -> "3")))
}
def upsertField(src:JObject, fld:JField): JValue = {
if(src \ fld._1 == JNothing){
src ~ fld
}
else{
src.replace(List(fld._1), fld._2)
}
}
}
Cosa non mi piace per molti motivi:
- Avere per lanciare in modo esplicito i risultati di
parse(json)
-JObject
- Il risultato della funzione
upsertField
è unJValue
, che dovrò rifusione se Voglio manipolare ulteriormente l'oggetto - La funzione
upsertField
si sente semplicemente poco elegante - Non funziona per i campi che non si trovano al livello superiore della gerarchia
C'è un modo migliore per trasformare AST?
EDIT: come una soluzione al problema, sono riuscito a convertire il mio JSON per Scala classi regolari, e manipolarli con le lenti (Using Lenses on Scala Regular Classes)
ciò che AST stand for? –
@QuyTang AST sta per "abstract syntax tree" – Eduardo
Grazie @Eduardo –