Saya menggunakan build in JSON class di Scala 2.8 untuk mengurai kode JSON. Saya tidak ingin menggunakan Liftweb satu atau lainnya karena meminimalkan ketergantungan.
Cara saya melakukannya sepertinya terlalu penting, adakah cara yang lebih baik untuk melakukannya?
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]
}
JSON.parseFull
kembaliOption[Any]
, jadi ini dimulai denganList(None)
atauList(Some(any))
. IniSome
untuk pencocokan pola padaOption
.Ini adalah cara saya melakukan pencocokan pola:
sumber
Saya suka jawaban @ huynhjl, itu menuntun saya ke jalan yang benar. Namun, ini tidak bagus dalam menangani kondisi kesalahan. Jika node yang diinginkan tidak ada, Anda mendapatkan pengecualian cast. Saya telah menyesuaikan ini sedikit agar
Option
dapat menangani ini dengan lebih baik.Tentu saja, ini tidak menangani kesalahan sebanyak menghindarinya. Ini akan menghasilkan daftar kosong jika salah satu node json hilang. Anda dapat menggunakan a
match
untuk memeriksa keberadaan node sebelum bertindak ...sumber
def unapply(a: Option[Any]): Option[T] = a.map(_.asInstanceOf[T])
.MatchError
gantinya (Scala 2.12). Diperlukan untuk membungkus untuk dalam blok coba / tangkap untuk itu. Ada ide yang lebih bagus?Saya mencoba beberapa hal, mendukung pencocokan pola sebagai cara menghindari casting tetapi mengalami masalah dengan penghapusan jenis pada jenis koleksi.
Masalah utama tampaknya adalah bahwa tipe lengkap hasil parse mencerminkan struktur data JSON dan tidak praktis atau tidak mungkin dinyatakan sepenuhnya. Saya rasa itulah mengapa Any digunakan untuk memotong definisi tipe. Menggunakan Setiap prospek untuk kebutuhan transmisi.
Saya telah meretas sesuatu di bawah ini yang ringkas tetapi sangat spesifik untuk data JSON yang tersirat oleh kode dalam pertanyaan. Sesuatu yang lebih umum akan lebih memuaskan tetapi saya tidak yakin apakah itu akan sangat elegan.
sumber
sumber
Kamu bisa melakukan seperti ini! Sangat mudah untuk mengurai kode JSON: P
sumber
Ini adalah cara saya melakukan Library Combinator Scala Parser:
sumber