0

Argonaut バックエンドでRapture JSONを使用しています (必要に応じて変更できます)。

任意の JSON 文字列が与えられた場合、理想的には各フィールドのタプル (fieldName、fieldType、fieldValue) のリストを取得するために、それをフラット オブジェクト (ネストされた JSON オブジェクトではない) として解析する必要があります。

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 に答える