我可以使json4s的提取方法不区分大小写吗?

时间:2018-09-14 05:55:45

标签: scala json4s capitalization

我正在使用案例类通过json4s的extract方法提取json。不幸的是,我使用的“自然地球”源数据与套管并不一致...在某些分辨率下,一个字段称为iso_a2,在某些分辨率下,它称为ISO_A2。我只能让json4s接受与case类中的字段匹配的那个:

object TopoJSON {
 case class Properties(ISO_A2: String)
...
// only accepts capitalised version.

有什么方法可以使json4s忽略大小写并接受两者吗?

1 个答案:

答案 0 :(得分:1)

使用配置属性无法使其不区分大小写,但是可以通过在解析的JSON中使用小写或大写的字段名来实现类似的结果。

例如,我们有输入:

case class Properties(iso_a2: String)
implicit val formats = DefaultFormats

val parsedLower = parse("""{ "iso_a2": "test1" }""")
val parsedUpper = parse("""{ "ISO_A2": "test2" }""")

我们可以使用短函数将所有 all 字段名称小写:

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)