如何在scala中解析Json

时间:2019-04-19 13:00:29

标签: json scala circe

我想知道如何解析JSON

我正在尝试在scala中解析json。

但是我不知道如何解析

还有更好的方法吗?

键从1开始顺序编号

我使用circe库...

谢谢

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

1 个答案:

答案 0 :(得分:1)

假设您有一个这样的字符串(请注意,我删除了结尾的逗号,这是无效的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表示形式-如果这对您不起作用,请扩展您的问题,我将更新答案。