【发布时间】:2015-10-12 12:12:46
【问题描述】:
我想要object 类型的属性,它可以是string 或Template 类型。
是否可以告诉 Json.NET 将某些内容解析为几种指定类型之一?
class MyClass
{
public object Template { get; set; }
}
在哪里Template = "TemplateName"
{
"Template": "TemplateName"
}
或Template = new Template()
{
"Template": { "Name": "OtherTamplate", ... }
}
更新:
我尝试遵循@krillgar 的建议并创建自定义JsonConverter,但不幸的是CanConvert 方法仅接收目标类型,在本例中为object。这些信息不足以告诉它是否可以反序列化(如果我有其他 object 属性)。我想我毕竟需要它是 Template 或创建一个派生类型,如 TemplateReference 或其他东西:
class myconverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
// objectType = typeof(object)
throw new NotImplementedException();
}
}
Configuration = JsonConvert.DeserializeObject<MyClass>(text, new myconverter());
免责声明
这个问题曾经作为How to deserialize a JSON property that can be two different data types using Json.NET 的副本被关闭。因为在写我的问题时我还不知道已经有一个类似的问题我想澄清它们之间的区别以防止它在将来被关闭:
另一个问题是关于如何将不同的值反序列化为 concrete 类型,而我的问题是将不同的值反序列化为 object。乍一看似乎是一样的,因为在这两个示例中,只有属性的类型不同,但它对整个应用程序设计有巨大的影响。对我来说重要的是,我可以使用 object 来存储不同的专用类型,而不是一种具有多种职责的类型。
【问题讨论】:
-
当然。你必须为它创建一个custom deserializer。
-
@krillgar:谢谢你的线索 :) 我没想到我会需要它复杂。我曾希望有一些 secret 属性来添加 to 属性并指定可能的类型或反序列化器的设置。
-
您需要为 MyClass 而不是 Template 定制 desalizer。然后 MyClass 解串器必须决定模板属性是字符串还是模板,并调用适当的标准解串器。
-
太好了,感谢您将其作为副本关闭。链接的问题不会以任何方式回答我的问题。我想将多种类型反序列化为对象而不是特定类型。
-
@Ben 我喜欢这个想法,但是我不确定我是否真的需要自己解析每个属性。如果我为
MyClass创建一个转换器并覆盖ReadJson方法,我可以只处理我想以不同方式处理的类型或属性,并为其他所有内容使用一些默认转换器吗?