【问题标题】:Can I make json4s's extract method case insensitive?我可以让 json4s 的提取方法不区分大小写吗?
【发布时间】:2018-09-14 05:55:45
【问题描述】:
我正在使用案例类通过 json4s 的 extract 方法提取 json。不幸的是,我使用的自然地球源数据与套管不一致……在某些分辨率下,字段称为iso_a2,在某些分辨率下称为ISO_A2。我只能让json4s接受与case类中字段匹配的那个:
object TopoJSON {
case class Properties(ISO_A2: String)
...
// only accepts capitalised version.
有什么办法可以让json4s忽略大小写,同时接受?
【问题讨论】:
标签:
scala
json4s
capitalization
【解决方案1】:
无法使用配置属性使其不区分大小写,但可以通过将解析的 JSON 中的字段名称小写或大写来实现类似的结果。
例如,我们有我们的输入:
case class Properties(iso_a2: String)
implicit val formats = DefaultFormats
val parsedLower = parse("""{ "iso_a2": "test1" }""")
val parsedUpper = parse("""{ "ISO_A2": "test2" }""")
我们可以使用短函数小写所有字段名称:
private def lowercaseAllFieldNames(json: JValue) = json transformField {
case (field, value) => (field.toLowerCase, value)
}
或仅针对特定字段:
private def lowercaseFieldByName(fieldName: String, json: JValue) = json transformField {
case (field, value) if field == fieldName => (fieldName.toLowerCase, value)
}
现在,提取案例类实例:
val resultFromLower = lowercaseAllFieldNames(parsedLower).extract[Properties]
val resultFromUpper = lowercaseAllFieldNames(parsedUpper).extract[Properties]
val resultByFieldName = lowercaseFieldByName("ISO_A2", parsedUpper).extract[Properties]
// all produce expected items:
// Properties(test1)
// Properties(test2)
// Properties(test2)