【问题标题】:How to parse Json in scala如何在scala中解析Json
【发布时间】:2025-12-08 03:15:02
【问题描述】:

我想知道如何解析 JSON

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

但是我不知道怎么解析

有没有更好的办法?

key从1开始依次编号

我使用 circe 库...

谢谢

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

【问题讨论】:

  • 请分享您的代码。如果您没有添加代码,我们将无法在您的代码中找到错误。
  • 您可以粘贴您的 Circe 代码吗?您是否尝试将其解析为案例类?如果是这样,Scala 不支持数字作为属性名称,因此您的案例类应该已转义命名为 case class Foo(`1`: Int)

标签: json scala circe


【解决方案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 表示形式——如果这对您不起作用,请扩展您的问题,我会更新答案。

【讨论】: