gpt4 book ai didi

.net - 使用 Newtonsoft.Json,如何将 JSON 反序列化为具有包含接口(interface)类型的 IEnumerable 属性的类型?

转载 作者:行者123 更新时间:2023-12-04 18:13:19 25 4
gpt4 key购买 nike

我正在使用发送 JSON 的 RESTful Web 服务,我尝试使用 HttpContent.ReadAsAsync<T> 对其进行反序列化.我尝试反序列化的类型声明了一个属性,该属性返回一个包含接口(interface)类型的 IEnumerable。此代码片段演示了我尝试反序列化为的类型:

public class Data
{
public IEnumerable<IChild> Children { get; set; };
}

问题在于 Newtonsoft.Json,底层 HttpContent.ReadAsAsync<T>不明白如何反序列化 IChild 类型的对象,后者是一个接口(interface)。如何向 Newtonsoft.Json 指定如何将 IChild 反序列化为具体类型?

最佳答案

您可以使用自定义 Converter告诉 JSON.NET 如何反序列化该接口(interface)的类型。下面的代码显示了一个示例。

public class StackOverflow_12197892
{
public class Data
{
public IEnumerable<IChild> Children { get; set; }

public override string ToString()
{
return string.Format("Data{{Children=[{0}]}}",
string.Join(", ", Children.Select(c => string.Format("{0}/{1}", c.Name, c.IsFemale ? "girl" : "boy"))));
}
}
public interface IChild
{
string Name { get; }
bool IsFemale { get; }
}
public class Son : IChild
{
public Son(string name)
{
this.Name = name;
}

public string Name { get; private set; }
public bool IsFemale { get { return false; } }
}
public class Daughter : IChild
{
public Daughter(string name)
{
this.Name = name;
}

public string Name { get; private set; }
public bool IsFemale { get { return true; } }
}
class ChildConverter : Newtonsoft.Json.JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(IChild).IsAssignableFrom(objectType);
}

public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
{
JObject obj = serializer.Deserialize<JToken>(reader) as JObject;
if (obj != null)
{
bool isFemale = obj["isFemale"].ToObject<bool>();
string name = obj["name"].ToObject<string>();
if (isFemale)
{
return new Daughter(name);
}
else
{
return new Son(name);
}
}
else
{
return null;
}
}

public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public static void Test()
{
Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer();
serializer.Converters.Add(new ChildConverter());
string json = "{'Children':[{'name':'John',isFemale:false},{'name':'Mary',isFemale:true}]}".Replace('\'', '\"');
var obj = serializer.Deserialize(new StringReader(json), typeof(Data));
Console.WriteLine(obj);
}
}

关于.net - 使用 Newtonsoft.Json,如何将 JSON 反序列化为具有包含接口(interface)类型的 IEnumerable 属性的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12197892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com