Scala & json4s - 使用以数字字符开头的字段解析 JSON

Scala & json4s - parsing JSON with fields that start with a numeric character

我有深度嵌套的 JSON 解析器(使用 json4s.jackson),我试图使用 case classes.

来简化它们

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

示例:

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]

这会起作用...如果字段命名为 xgLog,但字段实际上命名为 5gLog 如上所述,我无法为 class 喜欢 5gLog...

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

我想到了

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

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

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

case class RawRecord(fivegLog: Raw5gLog)

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

val rawRecord = RawRecord(jval)

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

有没有更好的方法?

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

case class RawRecord(`5gLog`: Raw5gLog)

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