Как разобрать Json в скале - PullRequest
       16

Как разобрать Json в скале

1 голос
/ 19 апреля 2019

Я хочу знать, как разобрать JSON

Я пытаюсь разобрать JSON в Scala.

Но я не знаю, как разобрать

Есть ли лучший способ?

ключ пронумерован последовательно от 1

Я использую библиотеку Circe ...

Спасибо

{
  "1": {
    "name": "hoge",
    "num": "60"
  },
  "2": {
    "name": "huga",
    "num": "100"
  },
  "3": {
    "name": "hogehuga",
    "num": "10"
  },
}

1 Ответ

1 голос
/ 19 апреля 2019

Предполагая, что у вас есть строка, подобная этой (обратите внимание, что я удалил запятую, которая недопустима в формате JSON):

val doc = """
{
  "1": {
    "name": "hoge",
    "num": "60"
  },
  "2": {
    "name": "huga",
    "num": "100"
  },
  "3": {
    "name": "hogehuga",
    "num": "10"
  }
}
"""

Вы можете проанализировать его с помощью circe следующим образом (при условии, что вы добавили модуль circe-jawn в конфигурацию сборки):

scala> io.circe.jawn.parse(doc)
res1: Either[io.circe.ParsingFailure,io.circe.Json] =
Right({
  "1" : {
    "name" : "hoge",
    "num" : "60"
  },
  "2" : {
    "name" : "huga",
    "num" : "100"
  },
  "3" : {
    "name" : "hogehuga",
    "num" : "10"
  }
})

В circe (и некоторых других библиотеках JSON) слово "parse" используется для обозначения преобразования строк в представление JSON (в данном случае io.circe.Json). Скорее всего, вы хотите что-то еще, например карту для тематических классов. В действительности этот вид преобразования в не связанные с JSON типы Scala называется декодированием и может выглядеть следующим образом:

scala> import io.circe.generic.auto._
import io.circe.generic.auto._

scala> case class Item(name: String, num: Int)
defined class Item

scala> io.circe.jawn.decode[Map[Int, Item]](doc)
res2: Either[io.circe.Error,Map[Int,Item]] = Right(Map(1 -> Item(hoge,60), 2 -> Item(huga,100), 3 -> Item(hogehuga,10)))

Конечно, вы можете декодировать этот JSON во множество различных представлений Scala - если это не сработает, пожалуйста, расширьте свой вопрос, и я обновлю ответ.

...