json - 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 方法并将它用于所有事情,但对于一小部分数据来说似乎有很多额外的代码。
有没有更好的办法?
解决方案
Scala 可以使用任何字符串作为变量名,但您可能必须用反引号将其引用:
case class RawRecord(`5gLog`: Raw5gLog)
type
如果您有一个名为的字段或任何其他保留字,您也需要这样做。例如,这就是-
函数名称的方式。
推荐阅读
- python - LMFIT - 从 Fitfunction 中提取变量
- android - 将数据上传到服务器然后使用 RxJava 在本地存储的最佳方法是什么
- ios - 在启动 Swift tableview 时自动加载图像
- python - 使用 matplotlib 仅在圆圈内绘制绘图
- tensorflow - 如何在 gpu 上运行假量化图?
- protractor - browser.driver.manage().window().maximize(); 不工作
- excel - Excel VBA在行中查找字符串
- kubernetes - 无法从同一子网上的 k8s pod 访问 GCE 实例
- ios - 在 iOS 11.3 中,didReceiveNotification 函数没有在点击时调用
- javascript - Datepicker 不是 ajax 请求后的函数