簡體   English   中英

讀取 JSON 並解析內容並在 Scala 中顯示結果

[英]Read a JSON and parse the contents and display the result in Scala

我是scala的新手。 我嘗試讀取 json 並使用json4s library對其進行解析。 已經編寫了案例 class 以及用於讀取和解析示例 json 文件的代碼。 我需要迭代json並打印每個屬性的詳細信息。

案例 Class

case class VehicleDetails(
    name: String,
    manufacturer: String,
    model:  String,
    year:   String,
    color:  String,
    seat:   Int,
    variants: Seq[String],
    engine: Int,
    dealer: Map[String, String],
    franchise:    Map[String, String])

json 數據和我嘗試的代碼如下所示。

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


object CarDetails  extends App {

  val json = parse("""{
  "vehicle_details": [
    {
      "CAR": {
        "name": "Brezza",
        "manufacturer": "Maruti",
        "model": "LDI",
        "year": 2019,
        "color": "Blue",
        "seat": 5,
        "engine": 1,
        "cylinder": 4,
        "variants": [
          "LDI",
          "LDI(O)",
          "VDI",
          "VDI(O)",
          "ZDI",
          "ZDI+"
        ],
        "dealer": {
          "kerala": "Popular"
        },
        "franchise": {
          "ekm": "popular_ekm"
        }
      },
      "SUV": {
        "name": "Scross",
        "manufacturer": "Maruti",
        "model": "LDI",
        "year": 2020,
        "color": "Blue",
        "variants": [
          "LDI",
          "VDI",
          "ZDI"
        ],
        "dealer": {
          "kerala": "Popular"
        },
        "franchise": {
          "ekm": "popular_ekm"
        }
      }
    }
  ]
}""")

  implicit val formats = DefaultFormats
  val definition = json.extract[VehicleDetails.Definition]
  val elements = (json \\ "vehicle_details").children

這非常接近,只需要進行一些小的更改。

首先,創建一個封裝所有 JSON 數據的 class:

case class AllDetails(vehicle_details: List[Map[String, VehicleDetails]])

然后只需從 json 中extract json

implicit val formats = DefaultFormats

val details = Extraction.extract[AllDetails](json)

對於這個特定的 JSON,所有記錄中都不存在seatengine字段,因此您需要修改VehicleDetails以設置這些Option值:

case class VehicleDetails(
  name: String,
  manufacturer: String,
  model: String,
  year: String,
  color: String,
  seat: Option[Int],
  variants: Seq[String],
  engine: Option[Int],
  dealer: Map[String, String],
  franchise: Map[String, String]
)

[其他記錄中可能省略的其他值也需要是Option值]


您可以使用標准 Scala 方法取消選擇結果。 例如

res.vehicle_details.headOption.foreach { cars =>
  val typeNames = cars.keys.mkString(", ")
  println(s"Car types: $typeNames")

  cars.foreach { case (car, details) =>
    println(s"Car type: $car")
    println(s"\tName: ${details.name}")
    val variants = details.variants.mkString("[", ", ", "]")
    println(s"\tVariants: $variants")
  }
}

要返回原始 JSON,請使用Serialization

import org.json4s.jackson.Serialization

val newJson = Serialization.write(res)

println(newJson)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM