0

我正在使用带有 Argonaut 后端的Rapture JSON(如有必要,可以更改)。

给定一个任意 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问题

4

1 回答 1

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))
于 2016-01-03T18:50:36.563 回答