62,041
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Converters;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string s = "{\"B\":\"sdfasdf\",\"C3\":[{\"a\":\"sdfasdf\"},{\"a\":\"adsfasdf33333333\"}]}";
//提问,如何用 Newtonsoft.Json 正确解析属性为“接口集合<接口>”的字符串
//我想要能够正确解析 CC 类,也就是其属性是 IList<I> ,都是接口类型的。
//请注意,DD 类中可能还继续包含更深层次的集合接口。比如 DD还包含 D3 是 IList<IDD4> .
//CC occ = JsonConvert.DeserializeObject<CC>(s); //提示错误: Error setting value to 'C3' on 'ConsoleApplication1.CC'.
CC2 occ2 = JsonConvert.DeserializeObject<CC2>(s); //能够正确解析
Debug.Print(((DD)occ2.C3[0]).a);
//CC3 occ3 = JsonConvert.DeserializeObject<CC3>(s); //提示错误: Error setting value to 'C3' on 'ConsoleApplication1.CC'.
//Debug.Print(((DD)occ3.C3[0]).a);
}
}
/// <summary>
/// 请注意 CC CC2 CC3 只是在 C3 的定义上有区别。 CC 是我要最终实现的类。
/// </summary>
public class CC2
{
public string B;
[JsonConverter(typeof(ConcreteTypeConverter<List<DD>>))]
public IList<DD> C3;
}
public class CC3
{
public string B;
[JsonConverter(typeof(ConcreteTypeConverter<List<DD>>))]
public List<IDD> C3;
}
public class CC
{
public string B;
[JsonConverter(typeof(ConcreteTypeConverter<List<DD>>))]
public IList<IDD> C3;
}
public interface IDD
{
string a { get; set; }
}
public class DD : IDD
{
public string a { get; set; }
}
public class ConcreteTypeConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
//assume we can convert to anything for now
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//explicitly specify the concrete type we want to create
return serializer.Deserialize<T>(reader); //实现不了
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
//use the default serialization - it works fine
serializer.Serialize(writer, value);
}
}
}
interface IPet
{
string name;
}
class Cat:IPet
{
public string name{get;set;}
}
class Dog:IPet
{
public string name{get;set;}
}
现有Json:
{name:"Kitty"}
被 IPet来反序列化,你能确定它是Cat还是Dog吗?