[解決済み] Scalaの標準クラスを使ってScalaでJSONをパースするには?
2022-05-14 22:58:05
質問
JSONコードをパースするためにScala 2.8のビルドインJSONクラスを使っています。私は、依存関係を最小限にするために、Liftwebのものまたは他のものを使用したくありません。
私がやっている方法は、あまりにも命令的なように思えますが、それを行うためのより良い方法はありますか?
import scala.util.parsing.json._
...
val json:Option[Any] = JSON.parseFull(jsonString)
val map:Map[String,Any] = json.get.asInstanceOf[Map[String, Any]]
val languages:List[Any] = map.get("languages").get.asInstanceOf[List[Any]]
languages.foreach( langMap => {
val language:Map[String,Any] = langMap.asInstanceOf[Map[String,Any]]
val name:String = language.get("name").get.asInstanceOf[String]
val isActive:Boolean = language.get("is_active").get.asInstanceOf[Boolean]
val completeness:Double = language.get("completeness").get.asInstanceOf[Double]
}
どのように解決するのですか?
クラスキャストを行うエクストラクタを利用した解決方法です。
class CC[T] { def unapply(a:Any):Option[T] = Some(a.asInstanceOf[T]) }
object M extends CC[Map[String, Any]]
object L extends CC[List[Any]]
object S extends CC[String]
object D extends CC[Double]
object B extends CC[Boolean]
val jsonString =
"""
{
"languages": [{
"name": "English",
"is_active": true,
"completeness": 2.5
}, {
"name": "Latin",
"is_active": false,
"completeness": 0.9
}]
}
""".stripMargin
val result = for {
Some(M(map)) <- List(JSON.parseFull(jsonString))
L(languages) = map("languages")
M(language) <- languages
S(name) = language("name")
B(active) = language("is_active")
D(completeness) = language("completeness")
} yield {
(name, active, completeness)
}
assert( result == List(("English",true,2.5), ("Latin",false,0.9)))
forループの最初で、結果を人為的にリストで囲み、最後にリストを生成しています。そして、forループの残りの部分では、ジェネレータが(
<-
を使用)と値定義(
=
を使用) は、unapply メソッドを使用します。
(古い回答は編集で削除されています。気になる方は編集履歴を確認してください)
関連
-
[解決済み】RestClientException: 適切な HttpMessageConverter が見つかりませんでした。
-
TypeError: タイプ 'bytes' のオブジェクトは JSON シリアライズ可能ではありません。
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSONファイルをprettyprintする方法は?
-
[解決済み] JSONデータをファイルに書き込むにはどうしたらいいですか?
-
[解決済み] JSONオブジェクトをTypeScriptのクラスにキャストする方法を教えてください。
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
-
[解決済み】GoのJSONマーシャルでJSONのキー名を小文字にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] json gem のインストール中にエラー 'mkmf.rb can't find header files for ruby' が発生する。
-
[解決済み] JSON Schemaにおける "required "と "optional "の違いについて
-
[解決済み] JSONDecodeError: 期待される値:行1列1
-
TypeError: タイプ 'bytes' のオブジェクトは JSON シリアライズ可能ではありません。
-
ajax return json format Report 500 Internal Server Error
-
[解決済み] nodeやExpressを使用してJSONを返す正しい方法
-
[解決済み] JSONファイルのMongoimport
-
[解決済み] JSONファイルからRにデータをインポートする【重複あり
-
[解決済み] VSCodeでlaunch.jsonに環境変数を追加する方法
-
[解決済み] GoでJSONを部分的にマップにアンマーシャルする