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
或任何其他保留字的字段,您也需要这样做。例如,这就是 -
可以作为函数名称的方式。
我有深度嵌套的 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
或任何其他保留字的字段,您也需要这样做。例如,这就是 -
可以作为函数名称的方式。