我正在試驗json4s庫(基於lift-json)。我想要做的事情之一是將JSON字符串解析爲AST,然後對其進行處理。如何操縱Scala中的JSON AST
例如,我想插入一個字段(如果該字段不存在,則將該字段插入到AST中,或者如果它存在,則更新其值)。
我一直無法找到如何在文檔中做到這一點。嘗試使用可用的方法,我提出了以下方法,這種方法可行,但感覺笨拙。
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)
}
}
}
我不喜歡它的原因有很多:
- 了不得不
parse(json)
結果顯式轉換爲JObject
- 的
upsertField
函數的結果是一個JValue
,我將不得不重鑄如果我想進一步操作對象 upsertField
功能只是覺得很不起眼- 它不適用於不在層次結構頂層的字段
是否有更好的方法來轉換AST?
編輯:作爲一種解決方法的問題,我已成功地我的JSON轉換爲斯卡拉普通班,並與鏡頭操縱它們(Using Lenses on Scala Regular Classes)
什麼AST立場? –
@QuyTang AST代表「抽象語法樹」 – Eduardo
謝謝@Eduardo –