Прочитайте JSON, проанализируйте содержимое и отобразите результат в Scala - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок ie в scala. я пытаюсь прочитать json и разобрать его, используя json4s library. Уже написаны кейс-класс и код для чтения и разбора файла образца json. Мне нужно перебрать json и распечатать детали каждого атрибута.

Класс дела

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

1 Ответ

1 голос
/ 29 апреля 2020

Это довольно близко, требуется всего несколько небольших изменений.

Сначала создайте класс, который инкапсулирует все данные JSON:

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

Затем просто extract этот класс из json

implicit val formats = DefaultFormats

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

Для этих конкретных полей JSON поля seat и engine присутствуют не во всех записях, поэтому необходимо изменить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...