Scala, PureConfig — как прочитать конфигурационный файл json?

#scala #scala-cats #circe #pureconfig

#scala #scala-кошки #цирцея #pureconfig

Вопрос:

У меня есть простой config.json файл в моих ресурсах:

 {
  "configs": [
    {
      "someConfig": {
        "name": "my_name",
        "filters": {
          "name": "new"
        },
        "id": "some-config-id",
        "fixes": {
          "isFixed": true
        }
      }
    }
  ]
}
 

Я также создал case classes для заданных полей:

 final case class Configs(configs: List[SomeConfig])

  final case class SomeConfig(name: String,
                              filters: Filters,
                              id: String,
                              fixes: Fixes)

  final case class Filters(name: String)

  final case class Fixes(isFixed: Boolean)
 

Теперь я хочу прочитать этот конфигурационный файл с PureConfig :

 val configs: Configs = ConfigSource.resources("configs.json").loadOrThrow[Configs]
 

Но я получил ошибки:

 Exception in thread "main" pureconfig.error.ConfigReaderException: Cannot convert configuration to Configs. Failures are:
- Key not found: 'name'.
- Key not found: 'filters'.
- Key not found: 'id'.
- Key not found: 'fixes'
 

Я добавил также ProductHint :

  implicit def hint[A] = ProductHint[A](ConfigFieldMapping(CamelCase, CamelCase))
 

Но это не помогло.
Как я мог бы исправить это для чтения конфигураций из json файла?

Ответ №1:

Ваши классы case не соответствуют JSON. Это должно быть что-то вроде:

 {
  "configs": [
    {
      "name": "my_name",
      "filters": {
        "name": "new"
      },
      "id": "some-config-id",
      "fixes": {
        "isFixed": true
      }
    }     
  ]
}
 

Обратите внимание на отсутствие "someConfig": { ... } в качестве оболочки для объекта конфигурации. В качестве альтернативы вы должны иметь:

 final case class Configs(configs: List[SomeConfigWrapper])

final case class SomeConfigWrapper(someConfig: SomeConfig)

...
 

потому что в JSON у вас нет name , filters , id и fixes сразу внутри "configs" объекта.