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

此类目的是防治序列化Json字符串时的循环引用问题-------最好解决方案

http://james.newtonking.com/json/help/index.html

 

 

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AccpStudentMIS
{
    //此类目的是防治序列化Json字符串时的循环引用问题
    //此类为Object类的扩展方法,需要引用Newtonsoft.Json.dll类
    //使用方法:在Controller中调用 Content(对象.ToJsonString(), "text/html;charset=UTF-8");方法来返回Json
    public static class ObjectExtentions
    {
        public static string ToJsonString(this Object obj)
        {

            JsonSerializerSettings jsSettings = new JsonSerializerSettings();
            jsSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            return JsonConvert.SerializeObject(obj, jsSettings);
        }
    }
}

 

 

Newtonsoft中的几个妙用

 记录Newtonsoft在序列成Json时的两个妙用

 

JsonSerializerSettings js = new JsonSerializerSettings();

//1、属性为Null时不做序列化输出

            js.NullValueHandling = NullValueHandling.Ignore;

 

//2、属性为DateTime时,做指定的格式输出

            js.Converters.Add(new IsoDateTimeConverter()
            {
                DateTimeFormat ="yyyy-MM-dd HH:mm:ss"
            });

 

JsonConvert.SerializeObject(obj, Formatting.None, js);

 

 //3、设定某个属性不做json序列化输出(在属性头加[JsonIgnore])

      [JsonIgnore]
       public string Srl
       {
           get;
           set;
       }

 

 

/// <summary>
        /// 转化为JSON格式
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="depth">RecursionLimit</param>
        /// <returns></returns>
        public static string ToJson(this object obj, int maxDepth = 10)
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            //settings.MaxDepth = maxDepth;
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            settings.Converters.Add(new JavaScriptDateTimeConverter());
            return JsonConvert.SerializeObject(obj, settings);
        }

        public static string ToJsonIsoDateTime(this object obj)
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            settings.Converters.Add(new IsoDateTimeConverter());
            return JsonConvert.SerializeObject(obj, settings);
        }

        /// <summary>
        /// 将JSON反序列化为对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sJason"></param>
        /// <returns></returns>
        public static T FromJson<T>(this string obj, int maxDepth = 2)
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            //settings.MaxDepth = maxDepth;
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            settings.Converters.Add(new JavaScriptDateTimeConverter());
            return JsonConvert.DeserializeObject<T>(obj, settings);
        }

        /// <summary>
        /// 将JSON反序列化为对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sJason"></param>
        /// <returns></returns>
        public static T FromJsonIsoDateTime<T>(this string obj)
        {
            return JsonConvert.DeserializeObject<T>(obj, new IsoDateTimeConverter());
        }

 

  /// <summary>
        /// 转化为JSON格式
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="depth">RecursionLimit</param>
        /// <returns></returns>
        public static string ToJson(object obj, int maxDepth = 2)
        {
            return obj.ToJson(maxDepth);
        }

        /// <summary>
        /// 将JSON反序列化为对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sJason"></param>
        /// <returns></returns>
        public static T FromJson<T>(string obj, int maxDepth = 2)
        {
            return obj.FromJson<T>(maxDepth);
        }

 
 
 
 
 

相关文章:

  • Spring AOP 实现业务日志记录 (注解)
  • 必须知道的SQL编写技巧,多条件查询不拼字符串的写法
  • Mysql高级之权限检查原理
  • 我见过的 Objective-C, 讲的最通俗易懂的入门教程....
  • 数据结构概述
  • 关于与产品相关的品牌、国藉等与产品质量的一些思考(转)
  • centOS下安装JDK
  • 网络安全系列之四十七 在IIS6中申请并安装证书
  • 使用jQuery.FileUpload和Backload自定义控制器上传多个文件
  • 从零开始iOS8编程【HelloWorld】
  • 微软职位内部推荐-SDEII for Windows Phone Apps
  • 关于PCB 3D 模型的快速导入方法
  • FreeSWITCH在呼叫失败的情况下播放语音提示
  • STL容器的使用
  • Mysql索引类型 Normal,Unique,Full Text
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Java 网络编程(2):UDP 的使用
  • Javascript弹出层-初探
  • MQ框架的比较
  • PHP 7 修改了什么呢 -- 2
  • Theano - 导数
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从setTimeout-setInterval看JS线程
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 计算机在识别图像时“看到”了什么?
  • 盘点那些不知名却常用的 Git 操作
  • 前端攻城师
  • 巧用 TypeScript (一)
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 7行Python代码的人脸识别
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​Java并发新构件之Exchanger
  • # 数据结构
  • (1)STL算法之遍历容器
  • (4) PIVOT 和 UPIVOT 的使用
  • (9)STL算法之逆转旋转
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十一)图像的罗伯特梯度锐化
  • (算法)求1到1亿间的质数或素数
  • (转载)(官方)UE4--图像编程----着色器开发
  • *2 echo、printf、mkdir命令的应用
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET 依赖注入和配置系统
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET上SQLite的连接
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [17]JAVAEE-HTTP协议
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [android] 请求码和结果码的作用
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [AutoSAR系列] 1.3 AutoSar 架构