【问题标题】: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)
    

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多