Tôi đang thử nghiệm với thư viện json4s (dựa trên thang máy-json). Một trong những điều tôi muốn làm là phân tích một chuỗi JSON thành một AST, và sau đó thao tác nó.Cách thao tác JSON AST trong Scala
Ví dụ, tôi muốn nâng cấp một trường (chèn trường vào AST nếu nó không tồn tại hoặc cập nhật giá trị của nó nếu nó có).
Tôi chưa thể tìm thấy cách thực hiện trong tài liệu. Thử nghiệm với các phương pháp có sẵn, tôi đã đưa ra những điều sau đây, hoạt động, nhưng cảm thấy vụng về.
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)
}
}
}
Tôi không thích nó vì nhiều lý do:
- Phải đúc một cách rõ ràng các kết quả của
parse(json)
-JObject
- Kết quả của
upsertField
chức năng là mộtJValue
, mà tôi sẽ phải viết lại nếu Tôi muốn thao tác đối tượng hơn nữa - Chức năng
upsertField
chỉ cảm thấy rất không quan trọng - Nó không hoạt động đối với các trường không ở cấp cao nhất của hệ thống phân cấp
Có cách nào tốt hơn để chuyển đổi AST không?
EDIT: như một cách giải quyết cho vấn đề, tôi đã được quản lý để chuyển đổi JSON của tôi đến các lớp học thường xuyên Scala, và thao tác chúng với ống kính (Using Lenses on Scala Regular Classes)
gì AST đứng cho? –
@QuyTang AST là viết tắt của "cây cú pháp trừu tượng" – Eduardo
Cảm ơn @Eduardo –