如何用 Newtonsoft.Json 正确解析属性为“接口集合”的JSON字符串

changechange changechange 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如何用 Newtonsoft.Json 正确解析属性为“接口集合<接口>”的字符串
我想要能够正确解析 CC 类,也就是其属性是 IList<I> ,都是接口类型的。
请注意,DD 类中可能还继续包含更深层次的集合接口。比如 DD还包含 D3 是 IList<IDD4> .

//CC occ = JsonConvert.DeserializeObject<CC>(s); //提示错误: Error setting value to 'C3' on 'ConsoleApplication1.CC'.



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);
}
}
}
...全文

相关推荐

评论 9
收藏 已收藏
分享
返回顶部
changechange
.NET社区 62,271 成员 668,968 内容