如何让 PureConfig 将 JSON 反序列化为 JValue 字段?
How can I get PureConfig to deserialize JSON as a JValue field?
我的部分配置包含任意 JSON。我想将 JSON 反序列化为 JValue 以供以后处理。
但是,ConfigSource.load
抱怨找不到 type
密钥。
测试代码:
import org.json4s.JsonAST.JValue
import pureconfig.ConfigReader.Result
import pureconfig._
import pureconfig.generic.auto._
object PureConfig2JValue extends App {
case class Config(json: JValue)
val source: ConfigObjectSource = ConfigSource.string("{ \"json\": { \"test\": \"test\" } }")
val loadedSource: Result[Config] = source.load[Config]
println(loadedSource)
}
输出:
Left(ConfigReaderFailures(ConvertFailure(KeyNotFound(type,Set()),None,json),List()))
如何让 PureConfig 反序列化为 JValue?
更新:
我将 Gagandeep 的回答改编为我的旧版本 PureConfig:
implicit val configReader: ConfigReader[JValue] = new ConfigReader[JValue] {
override def from(cur: ConfigCursor): Either[ConfigReaderFailures, JValue] =
cur.asString match {
case Right(jsonString: String) => Right(parse(jsonString))
case Left(configReaderFailures: ConfigReaderFailures) => Left(configReaderFailures)
}
}
它更改了错误消息,我认为这是进步:
Left(ConfigReaderFailures(ConvertFailure(WrongType(OBJECT,Set(STRING)),None,json),List()))
PureConfig 似乎在某处期望一个字符串,但却找到了一个对象。我不确定断开连接的位置。我正在使用 cur.asString
来确保项目以其适当的类型返回。
更新二:
这可能不是最可靠的解决方案,但它适用于我的测试用例:
implicit val configReader: ConfigReader[JValue] = new ConfigReader[JValue] {
override def from(cur: ConfigCursor): Either[ConfigReaderFailures, JValue] = {
Right(
// Parse PureConfig-rendered JSON.
parse(
// Render config as JSON.
cur.value.render(ConfigRenderOptions.concise.setJson(true))
)
)
}
}
JValue 不是 class、元组、大小写 class 或密封特征,因此宏无法为其生成自动派生。为它定义一个 reader 应该会有帮助。
import org.json4s._
import org.json4s.native.JsonMethods._
implicit val configReader = new ConfigReader[JValue] {
override def from(cur: ConfigCursor): Result[JValue] = cur.asString.map(parse)
}
我的部分配置包含任意 JSON。我想将 JSON 反序列化为 JValue 以供以后处理。
但是,ConfigSource.load
抱怨找不到 type
密钥。
测试代码:
import org.json4s.JsonAST.JValue
import pureconfig.ConfigReader.Result
import pureconfig._
import pureconfig.generic.auto._
object PureConfig2JValue extends App {
case class Config(json: JValue)
val source: ConfigObjectSource = ConfigSource.string("{ \"json\": { \"test\": \"test\" } }")
val loadedSource: Result[Config] = source.load[Config]
println(loadedSource)
}
输出:
Left(ConfigReaderFailures(ConvertFailure(KeyNotFound(type,Set()),None,json),List()))
如何让 PureConfig 反序列化为 JValue?
更新:
我将 Gagandeep 的回答改编为我的旧版本 PureConfig:
implicit val configReader: ConfigReader[JValue] = new ConfigReader[JValue] {
override def from(cur: ConfigCursor): Either[ConfigReaderFailures, JValue] =
cur.asString match {
case Right(jsonString: String) => Right(parse(jsonString))
case Left(configReaderFailures: ConfigReaderFailures) => Left(configReaderFailures)
}
}
它更改了错误消息,我认为这是进步:
Left(ConfigReaderFailures(ConvertFailure(WrongType(OBJECT,Set(STRING)),None,json),List()))
PureConfig 似乎在某处期望一个字符串,但却找到了一个对象。我不确定断开连接的位置。我正在使用 cur.asString
来确保项目以其适当的类型返回。
更新二:
这可能不是最可靠的解决方案,但它适用于我的测试用例:
implicit val configReader: ConfigReader[JValue] = new ConfigReader[JValue] {
override def from(cur: ConfigCursor): Either[ConfigReaderFailures, JValue] = {
Right(
// Parse PureConfig-rendered JSON.
parse(
// Render config as JSON.
cur.value.render(ConfigRenderOptions.concise.setJson(true))
)
)
}
}
JValue 不是 class、元组、大小写 class 或密封特征,因此宏无法为其生成自动派生。为它定义一个 reader 应该会有帮助。
import org.json4s._
import org.json4s.native.JsonMethods._
implicit val configReader = new ConfigReader[JValue] {
override def from(cur: ConfigCursor): Result[JValue] = cur.asString.map(parse)
}