Извлечь тип, ключ и значение из объекта 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))
Другие вопросы по тегам