我不确定你的代码是如何Foo
确定Bar
的,但现在让我们假设你有一个这样的 JSON 结构:
var json = @"
{
isFoo: true,
item: {}
}";
在这种情况下Foo
或Bar
由 确定isFoo
。
FooOrBar
类可能是主观的。我不会这样定义类,而是使用多态性:
interface IItem
{
bool IsFoo { get; }
}
class Foo : IItem
{
public bool IsFoo => true;
}
class Bar : IItem
{
public bool IsFoo => false;
}
[JsonConverter(typeof(CustomJsonConverter))]
class MyClass
{
public IItem Item { get; set; }
}
我设置CustomJsonConverter
为MyClass
因为我有 JSON 结构。我需要使用父对象中可用的信息item
来确定Foo
或者Bar
我必须设置JsonConverter
为Item
属性的声明类型。如果您使用item
属性中可用的信息,您可以将转换器移至Item
属性。
现在CustomJsonConverter
像这样实现:
class CustomJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => true;
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var token = JToken.ReadFrom(reader);
if (token.Type == JTokenType.Null)
{
return null;
}
// Create an instance of MyClass, and set property as per "isFoo".
var obj = new MyClass();
if (token["isFoo"].Value<bool>())
{
obj.Item = new Foo();
}
else
{
obj.Item = new Bar();
}
// Populate properties
serializer.Populate(token.CreateReader(), obj);
return obj;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotSupportedException();
}
}