首页 > 解决方案 > Scala & json4s - 使用以数字字符开头的字段解析 JSON

问题描述

我有深度嵌套的 JSON 解析器(使用json4s.jackson),我试图简化使用案例类。

我的问题是......一些字段以数字开头,但 scala 不能有一个以数字字符开头的 arg 名称。

例子:

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

implicit val formats = DefaultFormats

val jsonStr = """{"5gLog":{"i":99}}"""      // <--- note the field "5gLog"
val jval = parse(jsonStr)

case class Raw5gLog(i: Int)
val raw5gLog = (jval \ "5gLog").extract[Raw5gLog]

这行得通。但是我需要做的是,因为这些字段嵌套在 JSON 的深处......是这样的......

val jsonStr = """{"xgLog":{"i":99}}"""
val jval = parse(jsonStr)

case class RawRecord(xgLog: Raw5gLog)
val rawRecord = jval.extract[RawRecord]

这会起作用......如果字段命名为 like xgLog,但字段实际上命名5gLog为如上,我不能给一个类的 arg 名称5gLog......

case class RawRecord(5gLog: Raw5gLog)
// error: Invalid literal number

我想到了类似的东西

parse(jsonStr.replace("\"5g", "\"fiveg"))

但是除了字段名称之外,JSON 中还有可能受到影响的真实数据。

我能想到的最佳解决方案是向受影响的案例类添加额外的应用方法......

case class RawRecord(fivegLog: Raw5gLog)

object RawRecord {
  def apply(jval: JValue): RawRecord =
    RawRecord( (jval \ "5gLog").extract[Raw5gLog] )
}

val rawRecord = RawRecord(jval)

但我觉得每次我为边缘情况做一些结构上不同的解决方法时,总是我的代码开始变得一团糟。我可以给每个案例类一个新的 apply 方法并将它用于所有事情,但对于一小部分数据来说似乎有很多额外的代码。

有没有更好的办法?

标签: jsonscalaparsingjson4s

解决方案


Scala 可以使用任何字符串作为变量名,但您可能必须用反引号将其引用:

case class RawRecord(`5gLog`: Raw5gLog)

type如果您有一个名为的字段或任何其他保留字,您也需要这样做。例如,这就是-函数名称的方式。


推荐阅读