所以我有一个API,我点击它是为了在数据库中获取动物的详细信息
这些动物都有ID,所以我的web请求看起来像是/animal/1234
API的响应如下所示:
{
"name": "Tony",
"type": "Tiger",
"stripeCount": 14
}或者另选地
{
"name": "Kermit",
"type": "Frog",
"slimy": true
}当我查询API时,我不知道我会得到什么动物的type,但在某些情况下,我想把它们反序列化为适合它们的type的类。
下面是我目前正在使用的类,以及我正在尝试使用的JsonConverter属性:
[JsonConverter(typeof(AnimalJsonConverter))]
class Animal {
public string name { get; set; }
public string type { get; set; }
}
class Tiger : Animal {
public int stripeCount { get; set; }
}我已经设置了一个实现方法ReadJson的JsonConverter<Animal>,如下所示:
public override Animal ReadJson(JsonReader reader, Type objectType, Post existingValue, bool hasExistingValue, JsonSerializer serializer) {
var animalObj = JObject.Load(reader);
var type = (string)animalObj["type"];
switch(type) {
case "Tiger":
return animalObj.ToObject<Tiger>();
default:
return animalObj.ToObject<Animal>();
}
}然而,这导致了一个问题,因为语句animalObj.ToObject<Tiger>();尊重Animal上的JsonConverter,并试图再次调用我的ReadJson方法,从而导致递归地狱
如果任何人能看到这个问题的解决方案,我将不胜感激。
发布于 2019-04-02 00:45:06
您可以使用不同的策略-填充类型的实例:
class AnimalJsonConverter : JsonConverter<Animal>
{
public override void WriteJson(JsonWriter writer, Animal value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override Animal ReadJson(JsonReader reader, Type objectType,
Animal existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var animalObj = JObject.Load(reader);
var type = (string)animalObj["type"];
Animal instance;
switch (type)
{
case "Tiger":
instance = new Tiger();
break;
case "Frog":
instance = new Frog();
break;
default:
instance = new Animal();
break;
}
serializer.Populate(animalObj.CreateReader(), instance);
return instance;
}
}https://stackoverflow.com/questions/55459238
复制相似问题