【发布时间】:2020-08-13 21:57:01
【问题描述】:
我有一个 JSON 字符串,我想根据 type 将其转换为多种可能的类型之一:
{
"type": "x",
"val": {...}
}
type 是一个枚举。 val 应该只匹配与该特定枚举键关联的类型。所有可能的有效val 都将具有相应的 C# 类。
是否可以一次性完成(而不是先只解析type,然后使用switch 尝试将val 解析为正确的类型)。
如何在无需手写代码来映射有效类型/值组合的情况下递归地完成此操作?例如。如果这个“JSON 枚举”模式是嵌套的,那么 val 对象包含另一个 type。
谢谢
【问题讨论】:
-
请展示至少两种类型的示例以及如何手动解析它们。更有趣的问题是您将如何处理反序列化的值,因为 C# 在编译时无法确定
val的类型,因此您必须“点入”它,例如deserialized.val.SomePropOfEnum1.SomePropOfEnum2。 -
@CodeCaster 我应该有代表所有可能的
val的类。这不是动态 JSON,我知道它的结构。我问是否有可能不必手动将type映射到正确的val- 可以用属性或泛型来完成吗? -
你有类,但没有属性也没有类型。鉴于您展示的 JSON,您将如何反序列化它?您不能使用泛型 (
var o = JsonConvert.DeserializeObject<TypeWithVal<Foo>>),因为在阅读 JSON 之前,您不会知道自己需要Foo。特别是如果它是递归的。所以你也许可以创建一个自定义转换器。但同样,请举例说明您将如何使用switch()进行操作,并展示一些实际输入和用法。 -
我没有例子,因为我目前正在研究最好的方法。我正在考虑使用
var t = JsonConvert.DeserializeObject<KeyOnly>(jsonStr)获取type,然后使用switch(t.type){"x": {parseVal(jsonStr)}}。我正在寻找类似 Rust 枚举的东西,它可以表达一个包含特定类型的枚举变体 doc.rust-lang.org/book/ch06-01-defining-an-enum.html