Newtonsoft.Json序列化踩坑:IEnumerable
2020-09-30 13:05
85 查看
Newtonsoft.Json 是.net下广泛应用的JSON操作库,使用方便、数据可视化度高。但也总会踩坑……
如果需要序列化的对象实现了IEnumerable接口,Newtonsoft.Json就会认为这个对象是一个数组,然后遍历这个对象,输出其中的值。如果这个对象还包含有其他的属性,那其他属性就会被忽略,序列化后发生数据丢失。
测试源码:
public class Test : IEnumerable { public string str1 = "字段字符串"; public string str2 { get; set; } = "属性字符串"; private string s="私有字段"; public string S { get { return s; } set { s = value; } } [JsonProperty] List<TestNode> lstDrillTools = new List<TestNode>(); public Test() { int index = 0; lstDrillTools.Add(new TestNode() { str1= (index++).ToString()}); lstDrillTools.Add(new TestNode() { str1 = (index++).ToString() }); lstDrillTools.Add(new TestNode() { str1 = (index++).ToString() }); lstDrillTools.Add(new TestNode() { str1 = (index++).ToString() }); lstDrillTools.Add(new TestNode() { str1 = (index++).ToString() }); } [OnDeserializing()] internal void OnDeserializingMethod(StreamingContext context) { lstDrillTools.Clear();//反序列化前 清空 } public TestNode this[int index] { get { return lstDrillTools[index]; } set { lstDrillTools[index] = value; } } /// <summary> /// 遍历钻具组合 /// </summary> /// <returns>返回钻具组合的枚举器</returns> public IEnumerator GetEnumerator() { if (lstDrillTools != null) { for (int i = 0; i < lstDrillTools.Count; i++) { yield return lstDrillTools[i]; } } } } public class TestNode { public string str1 = "字段字符串"; public string str2 { get; set; } = "属性字符串"; public bool isBool=false; }
上面的这种定义相当于实现了 I 56c Enumerable 接口,之所以实现这个接口,是因为可以直接遍历这个对象,不需要遍历这个对象的Data 属性上遍历。
但使用了JsonConvert.SerializeObject()方法序列化对象后的结果如下图,它丢失了部分字段:
实际想要的结果:
如果想要这种结果,只需要不实现IEnumerable接口就可以做到。最开始,还是在查找原因,以及寻求解决方法。但直到看了
Newtonsoft.Json源码 https://github.com/JamesNK/Newtonsoft.Json ,找到为什么实现了
IEnumerable接口就会有问题,最后找到了这里https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs#L1218
发现只要实现了
IEnumerable接口,就会被当作是一个Json 数组,foreach 遍历其中的元素,其他属性就会被忽略掉了,这就是为什么上面我们实现了
IEnumerable接口的对象序列化之后发生属性丢失的原因。
相关文章推荐
- Newtonsoft.Json 序列化踩坑之 IEnumerable
- 使用NewtonSoft.JSON.dll来序列化和发序列化对象(转载)
- Newtonsoft.Json 转Json字符串为空不序列化
- EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
- 使用JSON.Net(Newtonsoft.Json)作为ASP.Net MVC的json序列化和反序列化工具
- 使用NewtonSoft.JSON.dll来序列化和发序列化对象
- [转]Newtonsoft.Json 序列化和反序列化 时间格式
- Asp.Net Core中使用Newtonsoft.Json进行序列化处理解决返回值首字母小写
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
- ASP.NET:使用Newtonsoft.Json序列化和反序列化JSON对象的例子
- Newtonsoft.Json 序列化和反序列化 时间格式
- Newtonsoft.Json.4.5.0 序列化与反序列化json字符串使用方法总结
- newtonsoft.json 序列化和反序列化
- 使用NewtonSoft.JSON.dll来序列化和反序列化对象
- 使用Newtonsoft.Json进行JSON反序列化操作
- Json序列化之.NET开源类库Newtonsoft.Json的研究
- .NET C# Json序列化与反序列化——Newtonsoft.Json学习笔记
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
- [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
- Newtonsoft.Json 序列化日期问题解决