• json.net 比jsonIgnore 更好的方法 修改源码


    关于 JsonIgnore  问题,

    EF T4 模板 中 存在主外键关系

    namespace WindowsFormsApplication1
    {
        using System;
        using System.Collections.Generic;
        using Newtonsoft.Json;
        public partial class MaterielProcedures
        {
            public int Kid { get; set; }
            public Nullable<int> OKid { get; set; }
            public int Node { get; set; }
            public string ProcedureType { get; set; }
            public string ProcedureNeed { get; set; }
            public string Author { get; set; }
            public System.DateTime CreateTime { get; set; }
            public Nullable<System.DateTime> StartTime { get; set; }
            public Nullable<double> PlanHour { get; set; }
            public Nullable<System.DateTime> EndTime { get; set; }
            public Nullable<int> PercentAge { get; set; }
            public string ProcedureState { get; set; }
            public bool IsOut { get; set; }
            [JsonIgnore]
            public virtual bom_2d bom_2d { get; set; }
        }
    }

    bom_2d  是 MaterielProcedures  的外键 ,用到 json.net 来把 MaterielProcedures  类变成 json 字符串的时候,会因为这个外键报错。

    解决 方法是 在 public virtual bom_2d bom_2d { get; set; }上面一行 加上   [JsonIgnore]。

    但是 每次重新生成模板 ,都会 重新生成 MaterielProcedures 类。

    所以直接找到出问题的源码 ,进行修改,跟踪了 N 多方法 终于

     private void SerializeObject(JsonWriter writer, object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
            {
                OnSerializing(writer, contract, value);
    
                _serializeStack.Add(value);
    
                WriteObjectStart(writer, value, contract, member, collectionContract, containerProperty);
    
                int initialDepth = writer.Top;
    
                for (int index = 0; index < contract.Properties.Count; index++)
                {
                    JsonProperty property = contract.Properties[index];
                    try
                    {
                        object memberValue;
                        JsonContract memberContract;
    
                        if (!CalculatePropertyValues(writer, value, contract, member, property, out memberContract, out memberValue))
                            continue;
                        #region add by 253
                        if (!memberContract.CreatedType.BaseType.FullName.Contains("System."))
                            continue; 
                        #endregion
                        property.WritePropertyName(writer);
                        SerializeValue(writer, memberValue, memberContract, property, contract, member);
                    }
                    catch (Exception ex)
                    {
                        if (IsErrorHandled(value, contract, property.PropertyName, null, writer.ContainerPath, ex))
                            HandleError(writer, initialDepth);
                        else
                            throw;
                    }
                }
    
                if (contract.ExtensionDataGetter != null)
                {
                    IEnumerable<KeyValuePair<object, object>> extensionData = contract.ExtensionDataGetter(value);
                    if (extensionData != null)
                    {
                        foreach (KeyValuePair<object, object> e in extensionData)
                        {
                            JsonContract keyContract = GetContractSafe(e.Key);
                            JsonContract valueContract = GetContractSafe(e.Value);
    
                            bool escape;
                            string propertyName = GetPropertyName(writer, e.Key, keyContract, out escape);
    
                            if (ShouldWriteReference(e.Value, null, valueContract, contract, member))
                            {
                                writer.WritePropertyName(propertyName);
                                WriteReference(writer, e.Value);
                            }
                            else
                            {
                                if (!CheckForCircularReference(writer, e.Value, null, valueContract, contract, member))
                                    continue;
    
                                writer.WritePropertyName(propertyName);
    
                                SerializeValue(writer, e.Value, valueContract, null, contract, member);
                            }
                        }
                    }
                }
    
                writer.WriteEndObject();
    
                _serializeStack.RemoveAt(_serializeStack.Count - 1);
    
                OnSerialized(writer, contract, value);
            }


    搞定啦!就是 除了System 下面的数据类型,全部 continue!

    现在 发现 他其实是 错误的!  还是 使用 jsonIgnore  或者  

    JsonSerializerSettings set = new JsonSerializerSettings();
                set.ReferenceLoopHandling=ReferenceLoopHandling.Ignore;

    这样 没有 写 jsonIgnore 的 都 序列话了,而且不会报错。

  • 相关阅读:
    围炉夜话(14)
    围炉夜话(13)
    ATmega128中应用的hex与bootloader的hex合并的实现
    配置IAR for AVR 既可以仿真也可以生成Hex文件
    atmega128 bootloader程序在IAR-AVR下 linker文件的配置及原因
    一步步学习SPD2010--第十四章节--在Web页面使用控件(8)--关键点
    一步步学习SPD2010--第十四章节--在Web页面使用控件(7)--使用SP服务器控件
    一步步学习SPD2010--第十四章节--在Web页面使用控件(6)--测试ASP.NET表单
    一步步学习SPD2010--第十四章节--在Web页面使用控件(4)--使用ASP.NET验证控件
    一步步学习SPD2010--第十四章节--在Web页面使用控件(3)--验证用户数据输入
  • 原文地址:https://www.cnblogs.com/bingguang/p/3851900.html
Copyright © 2020-2023  润新知