Newtonsoft.Json 修改記錄

lingxyd_0發表於2011-08-21
 

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;

 會生成:帶有屬性名和空值的自迴圈體。

 

相關文章