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



我有深度嵌套的JSON解析器(使用json4s.jackson(,我正在尝试使用case类来简化它们。

我的问题是…有些字段以数字开头,但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]

这会起作用。。。如果字段的名称像xgLog,但字段的名称实际上像上面的5gLog,并且我不能给5gLog这样的类指定arg名称。。。

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

我想了一些类似的东西

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

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

我能想到的最好的解决方案是向受影响的case类添加额外的apply方法。。。

case class RawRecord(fivegLog: Raw5gLog)
object RawRecord {
def apply(jval: JValue): RawRecord =
RawRecord( (jval  "5gLog").extract[Raw5gLog] )
}
val rawRecord = RawRecord(jval)

但我觉得,每次我为边缘案例制定这样的结构不同的解决方案时,这总是我的代码变得一团糟的开始。我可以为每个case类提供一个新的application方法,并将其用于所有内容,但对于一小部分数据来说,这似乎是一大堆额外的代码。

有更好的方法吗?

Scala可以使用任何字符串作为变量名,但您可能必须用backticks引用它:

case class RawRecord(`5gLog`: Raw5gLog)

如果您有一个名为type或任何其他保留字的字段,也需要执行此操作。例如,-就是这样成为函数名的。

最新更新