Извлечь тип, ключ и значение из объекта Rapture JSON
Я использую 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!")
...
}}
ОБНОВЛЕНИЕ: это стало проблемой GitHub в Rapture-JSON
1 ответ
Я вроде работал над этим, используя Argonaut напрямую. Будучи немного жестоким со всеми этими опциями и скалярными дизъюнкциями, улучшения приветствуются!
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))