Newtonsoft.Json 修改记录

 

Newtonsoft.Json 修改记录

 

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

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

 

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

去掉 下面这两句:

    if (t.IsValueType)
        return true;

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

\Utilities\ReflectionUtils.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;

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值