当前位置: 首页 > news >正文

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 的 都 序列话了,而且不会报错。

转载于:https://www.cnblogs.com/bingguang/p/3851900.html

相关文章:

  • leetcode 栈 括号匹配
  • 周立功写给学单片机的年轻人
  • nginx配置文件中的location详解
  • CakePHP 编程笔记3
  • Floyd模板(详细操作最基础版)
  • Sendmail大全
  • 内核配置备份
  • Query 使用手册
  • 循环冗余校验码CRC,求解步骤
  • 求职中的平常心——Leo网上答疑48
  • 实验三 数据查询(4学时)
  • 北京簋街 美食完全攻略 + 簋街好吃的夜宵去处-----店铺介绍大全
  • 随书赠送的台历样式
  • Interview2---3g
  • 整合Bullet物理引擎到Ogre on iPhone
  • docker-consul
  • ES6系统学习----从Apollo Client看解构赋值
  • Fastjson的基本使用方法大全
  • go append函数以及写入
  • Iterator 和 for...of 循环
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Webpack 4x 之路 ( 四 )
  • 从0到1:PostCSS 插件开发最佳实践
  • 回流、重绘及其优化
  • 浅谈web中前端模板引擎的使用
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 用jQuery怎么做到前后端分离
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • MyCAT水平分库
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​插件化DPI在商用WIFI中的价值
  • #{}和${}的区别是什么 -- java面试
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #pragma data_seg 共享数据区(转)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net core控制台应用程序初识
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET DataGridView数据绑定说明
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @ComponentScan比较
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [04]Web前端进阶—JS伪数组
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [20150904]exp slow.txt
  • [3D基础]理解计算机3D图形学中的坐标系变换