#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"
объекта.