我正在试验 json4s 库(基于lift-json)。我想做的一件事是将 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函数的结果是 aJValue,如果我想进一步操作该对象,我将不得不重铸它
- upsertField只是感觉功能很不雅
- 它不适用于不在层次结构顶层的字段
有没有更好的方法来转换 AST?
编辑:作为解决问题的方法,我设法将我的 JSON 转换为 Scala 常规类,并使用镜头操作它们(在 Scala 常规类上使用镜头)