web-dev-qa-db-ja.com

json文字列をscalaマップに変換するにはどうすればよいですか?

構造が定義されていないネストされたjsonがあります。リモートファイルから読み込んでいるため、実行するたびに異なる場合があります。このjsonをMap[String, Any]タイプのマップに変換する必要があります。私はjson4sとjacksonパーサーを調べようとしましたが、これらは私が持っているこの問題を解決しないようです。誰が私がこれを達成できるか知っていますか?

文字列の例:

{"body":{
    "method":"string",
    "events":"string",
    "clients":"string",
    "parameter":"string",
    "channel":"string",
    "metadata":{
        "meta1":"string",
        "meta2":"string",
        "meta3":"string"
    }
},
"timestamp":"string"}

ネストのレベルは任意であり、事前定義されていません。
ユースケースを支援するには:
Map [String、Any]があり、バックアップとしてファイルに保存する必要があります。だから私はそれをjson文字列に変換してファイルに保存します。今度は新しいデータを取得するたびに、ファイルからjsonを取得し、それを再度マップに変換して計算を実行する必要があります。ジョブが失敗するとマップをメモリに保存できません。
json文字列を変換前の元のマップに戻すソリューションが必要です。

12
Udit Mehta

私はjson4s 3.2.11で次の方法を試しましたが、うまくいきました:

import org.json4s._
import org.json4s.jackson.JsonMethods._

//...
def jsonStrToMap(jsonStr: String): Map[String, Any] = {
  implicit val formats = org.json4s.DefaultFormats

  parse(jsonStr).extract[Map[String, Any]]
}

タイプFormatsimplicit valを定義していないのでしょうか?スコープ内でfindableである限り、すべてのメソッド内にimplicit valを含める必要がないことにも注意してください。

13
lambdista

次のコードを使用して、JSON文字列をMap[String, Any]に解析できます。

val jsonMap = parse(jsonString).values.asInstanceOf[Map[String, Any]]

ただし、これはタイプセーフではないであるため、マップから値を抽出するときには注意して使用する必要があります。

2
user297112