代码之家  ›  专栏  ›  技术社区  ›  Mohan

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

  •  0
  • Mohan  · 技术社区  · 6 年前

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

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

    有什么办法可以让json4s忽略案例并接受两者?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Antot    6 年前

    无法使用配置属性使其不区分大小写,但是可以通过将解析的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)