我正在使用Rapture JSON和Argonaut后端(必要时可以更改)。
给定一个任意的JSON字符串,我需要将它解析为一个扁平对象(没有嵌套的JSON对象),以便理想地获得一个元组列表 (fieldName,fieldType,fieldValue)每个字段。
import rapture.json._
import rapture.json.jsonBackends.argonaut._
val j = json"""{"what":"stuff"}"""
val extracted: List[(String, FieldType, Any)] = j.someMagic()
// So I can do this
extracted.map { _ match {
case (k, JString, v) => println("I found a string!")
...
}}
更新:这在rapture-json中成了github issue
答案 0 :(得分:3)
我直接使用Argonaut解决了这个问题。所有这些选项和scalaz分离都有点残酷,欢迎增强!
import rapture.json._
import rapture.json.jsonBackends.argonaut._
val parsed: Disjunction[String, argonaut.Json] = argonaut.Parse.parse(
"""{"what":"stuff", "num": 1, "bool":true}""")
val fieldzAndValues: Disjunction[String, Option[List[(argonaut.Json.JsonField, argonaut.Json)]]] = for {
jo <- parsed
flds = jo.hcursor.fields
vls = jo.objectValues
} yield vls.map( v => flds.map(_.zip(v))).flatten
fieldzAndValues.toOption.flatten.map(_.map(_ match {
case (k, v) if(v.isString) => s"$k string $v"
case (k, v) if(v.isBool) => s" $k bool $v"
case (k, v) if(v.isNull) => s"$k null $v"
case (k, v) if(v.isNumber) => s" $k number $v"
}))
// res0: Option[List[String]] = Some(List(what string "stuff", num number 1, bool bool true))