加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Newtonsoft.Json 修改记录

发布时间:2020-12-16 19:29:09 所属栏目:百科 来源:网络整理
导读:Newtonsoft.Json 修改记录 1.Newtonsoft.Json 可以反序列 但不能反序列化 KeyValuePaireTKey,TValue,是因为: KeyValuePaire 的两个属性 Key,Value 都是只读的.且,没有默认构造函数. 在文件:Newtonsoft.JsonNewtonsoft.JsonUtilitiesReflectionUtils.cs 里

Newtonsoft.Json 修改记录

1.Newtonsoft.Json 可以反序列 但不能反序列化 KeyValuePaire<TKey,TValue>,是因为:

KeyValuePaire 的两个属性 Key,Value 都是只读的.且,没有默认构造函数.

在文件:Newtonsoft.JsonNewtonsoft.JsonUtilitiesReflectionUtils.cs 里有一个函数:HasDefaultConstructor 作者的判断里有: 只要是值类型,就会有默认构造函数. 这是不对的.

去掉 下面这两句:

if (t.IsValueType)
return true;

2.对于 具有属性 (Attribute) Browsable = false 是不用序列化的.

UtilitiesReflectionUtils.cs (GetFieldsAndProperties 487行后添加)

代码
for (int i = 0; i < targetMembers.Count; i++) { MemberInfo member = targetMembers[i]; object[] objs = member.GetCustomAttributes(typeof(BrowsableAttribute),true); if (objs != null && objs.Length > 0) { if ((objs[0] as BrowsableAttribute).Browsable == false) { targetMembers.RemoveAt(i); i--; } } }

3. DateTime序列化错误:

JsonWriter.cs (WriteValue) 修改 1036行

代码
case TypeCode.DateTime: string dtValue = ""; DateTime? dt = convertible as DateTime?; if (dt.HasValue == false) { return; } if (dt.Value.Hour == 0 && dt.Value.Minute == 0 && dt.Value.Second == 0) { dtValue = dt.Value.ToShortDateString(); } else if (dt.Value.Year == 0 && dt.Value.Month == 0 && dt.Value.Day == 0) { dtValue = dt.Value.ToShortTimeString(); } else dtValue = dt.Value.ToString(); WriteValue(dtValue); return;

4.循环引用自己的问题。

JsonSerializer.cs (WriteMemberInfoProperty) 838 行: 修改

case ReferenceLoopHandling.Error:
return;

再狠点:JsonSerializer.cs (SerializeObject) 879 行。 添加:

if (writer.SerializeStack.Count > 0 && writer.SerializeStack[0].GetType() == value.GetType()) return;

会生成:带有属性名和空值的自循环体。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读