Могу ли я сделать метод извлечения json4s без учета регистра? - PullRequest
0 голосов
/ 14 сентября 2018

Я использую case-классы для извлечения json с помощью метода extract json4s. К сожалению, исходные данные Natural Earth, которые я использую, не согласуются с обсадной колонной ... в некоторых разрешениях поле называется iso_a2, а в некоторых - ISO_A2. Я могу только заставить json4s принять тот, который соответствует полю в классе дела:

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

Есть ли способ заставить json4s игнорировать регистр и принимать оба?

1 Ответ

0 голосов
/ 14 сентября 2018

Нет способа сделать его нечувствительным к регистру, используя свойства конфигурации, но аналогичный результат может быть достигнут либо в нижнем, либо в верхнем регистре имен полей в проанализированном 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)
}

Теперь, чтобы извлечь экземпляры класса case:

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)
...