scala - 在 pureconfig 中表示 Either
问题描述
我有一个这样的 HOCON 配置:
[
{
name = 1
url = "http://example.com"
},
{
name = 2
url = "http://example2.com"
},
{
name = 3
url = {
A = "http://example3.com"
B = "http://example4.com"
}
}
]
我想用pureconfig解析它。我如何表示 URL 可以是字符串或多个 url 的映射,每个 url 都有一个键?
我试过这个:
import pureconfig.ConfigSource
import pureconfig.generic.auto.exportReader
case class Site(name: Int, url: Either[String, Map[String, String]])
case class Config(sites: List[Site])
ConfigSource.default.loadOrThrow[Config]
但它导致“预期类型 OBJECT。找到 STRING。”
我知道 pureconfig 支持Option
. 我发现没有提到支持Either
,是不是意味着它可以用其他东西代替?
解决方案
如您所见Either
,不在开箱即用支持的类型列表中。
然而Either
属于密封的家庭,所以:
@ ConfigSource.string("""{ type: left, value: "test" }""").load[Either[String, String]]
res15: ConfigReader.Result[Either[String, String]] = Right(Left("test"))
@ ConfigSource.string("""{ type: right, value: "test" }""").load[Either[String, String]]
res16: ConfigReader.Result[Either[String, String]] = Right(Right("test"))
作品。如果你有一个密封的层次结构,pureconfig 会做的是需要一个具有字段的对象type
- 这个字段将用于将解析分派到特定的子类型。所有其他字段将作为字段传递以解析为该子类型。
如果这对您不起作用,您可以尝试自己实现编解码器:
// just an example
implicit def eitherReader[A: ConfigReader, B: ConfigReader] =
new ConfigReader[Either[A, B]] {
def from(cur: ConfigCursor) =
// try left, if fail try right
ConfigReader[A].from(cur).map(Left(_)) orElse ConfigReader[B].from(cur).map(Right(_))
}
现在不需要歧视值:
@ ConfigSource.string("""{ test: "test" }""").load[Map[String, Either[String, String]]]
res26: ConfigReader.Result[Map[String, Either[String, String]]] = Right(Map("test" -> Left("test")))
默认情况下不提供此功能,因为您必须自己回答一些问题:
- 你如何决定是否应该使用
Left
或Right
解码? Left
后备Right
或Right
后备Left
有意义吗?- 怎么样
Either[X, X]
?
如果您知道预期的行为是什么,您可以实现磨损的编解码器并在派生中使用它。
推荐阅读
- react-native - 反应本机ReferenceError:找不到变量:con
- asp.net - VS2019 页面打开时没有响应
- javascript - 在新窗口中打开图像数据
- javascript - NodeJS sql server中的多次插入
- android - 无法滚动离子日期时间选择器@ionic/React
- node.js - 从第二个/不同的谷歌帐户登录使用 mongoDB 会出现 e11000 错误
- linux - 在 RHEL8.2 中添加 RHEL 存储库
- docker - Docker php:7.2-apache-stretch 在我运行启动脚本时重新启动
- android - 将“Microsoft App Center”与 android studio 集成时出错
- javascript - Javascript:从服务器端渲染脚本时如何保存 ArrayBuffer?