1.引用Newtonsoft.Json库(JSON.NET)。

2.复制粘贴JsonHelper吧。

源代码:

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters; namespace Allen.Core
{
public static partial class JsonHelper
{
#region Private fields private static readonly JsonSerializerSettings JsonSettings; private const string EmptyJson = "[]";
#endregion #region Constructor static JsonHelper()
{
var datetimeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; JsonSettings = new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Ignore,
NullValueHandling = NullValueHandling.Ignore,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
JsonSettings.Converters.Add(datetimeConverter);
}
#endregion #region Public Methods /// <summary>
/// 应用Formatting.None和指定的JsonSerializerSettings设置,序列化对象到JSON格式的字符串
/// </summary>
/// <param name="obj">任意一个对象</param>
/// <param name="jsonSettings">在一个 Newtonsoft.Json.JsonSerializer 对象上指定设置,如果为null,则使用默认设置</param>
/// <returns>标准的JSON格式的字符串</returns>
public static string ToJson(object obj, JsonSerializerSettings jsonSettings)
{
return ToJson(obj, Formatting.None, jsonSettings);
} /// <summary>
/// 应用指定的Formatting枚举值None和指定的JsonSerializerSettings设置,序列化对象到JSON格式的字符串
/// </summary>
/// <param name="obj">任意一个对象</param>
/// <param name="format">指定 Newtonsoft.Json.JsonTextWriter 的格式设置选项</param>
/// <param name="jsonSettings">在一个 Newtonsoft.Json.JsonSerializer 对象上指定设置,如果为null,则使用默认设置</param>
/// <returns>标准的JSON格式的字符串</returns>
public static string ToJson(object obj, Formatting format, JsonSerializerSettings jsonSettings)
{
try
{
return obj == null ? EmptyJson : JsonConvert.SerializeObject(obj, format, jsonSettings ?? JsonSettings);
}
catch (Exception)
{
//TODO LOG
return EmptyJson;
}
} /// <summary>
/// 应用Formatting.None和指定的JsonSerializerSettings设置,反序列化JSON数据为dynamic对象
/// <para>如果发生JsonSerializationException异常,再以集合的方式重试一次,取出集合的第一个dynamic对象。</para>
/// <para>转换失败,或发生其它异常,则返回dynamic对象的默认值</para>
/// </summary>
/// <param name="json">需要反序列化的JSON字符串</param>
/// <param name="jsonSettings">在一个 Newtonsoft.Json.JsonSerializer 对象上指定设置,如果为null,则使用默认设置</param>
/// <returns>dynamic对象</returns>
public static dynamic FromJson(this string json, JsonSerializerSettings jsonSettings)
{
return FromJson<dynamic>(json, Formatting.None, jsonSettings);
} /// <summary>
/// 应用指定的Formatting枚举值None和指定的JsonSerializerSettings设置,反序列化JSON数据为dynamic对象
/// <para>如果发生JsonSerializationException异常,再以集合的方式重试一次,取出集合的第一个dynamic对象。</para>
/// <para>转换失败,或发生其它异常,则返回dynamic对象的默认值</para>
/// </summary>
/// <param name="json">需要反序列化的JSON字符串</param>
/// <param name="format">指定 Newtonsoft.Json.JsonTextWriter 的格式设置选项</param>
/// <param name="jsonSettings">在一个 Newtonsoft.Json.JsonSerializer 对象上指定设置,如果为null,则使用默认设置</param>
/// <returns>dynamic对象</returns>
public static dynamic FromJson(this string json, Formatting format, JsonSerializerSettings jsonSettings)
{
return FromJson<dynamic>(json, format, jsonSettings);
} /// <summary>
/// 应用Formatting.None和指定的JsonSerializerSettings设置,反序列化JSON数据到指定的.NET类型对象
/// <para>如果发生JsonSerializationException异常,再以集合的方式重试一次,取出集合的第一个T对象。</para>
/// <para>转换失败,或发生其它异常,则返回T对象的默认值</para>
/// </summary>
/// <param name="json">需要反序列化的JSON字符串</param>
/// <param name="jsonSettings">在一个 Newtonsoft.Json.JsonSerializer 对象上指定设置,如果为null,则使用默认设置</param>
/// <typeparam name="T">反序列化对象的类型</typeparam>
/// <returns></returns>
public static T FromJson<T>(string json, JsonSerializerSettings jsonSettings) where T : class, new()
{
return FromJson<T>(json, Formatting.None, jsonSettings);
} /// <summary>
/// 应用指定的Formatting枚举值None和指定的JsonSerializerSettings设置,反序列化JSON数据到指定的.NET类型对象
/// <para>如果发生JsonSerializationException异常,再以集合的方式重试一次,取出集合的第一个T对象。</para>
/// <para>转换失败,或发生其它异常,则返回T对象的默认值</para>
/// </summary>
/// <param name="json">需要反序列化的JSON字符串</param>
/// <param name="format">指定 Newtonsoft.Json.JsonTextWriter 的格式设置选项</param>
/// <param name="jsonSettings">在一个 Newtonsoft.Json.JsonSerializer 对象上指定设置,如果为null,则使用默认设置</param>
/// <typeparam name="T">反序列化对象的类型</typeparam>
/// <returns></returns>
public static T FromJson<T>(string json, Formatting format, JsonSerializerSettings jsonSettings) where T : class, new()
{
T result; if (jsonSettings == null)
{
jsonSettings = JsonSettings;
} try
{
result = string.IsNullOrWhiteSpace(json) ? default(T) : JsonConvert.DeserializeObject<T>(json, jsonSettings);
}
catch (JsonSerializationException) //在发生该异常后,再以集合的方式重试一次.
{
//LOG
try
{
var array = JsonConvert.DeserializeObject<IEnumerable<T>>(json, jsonSettings);
result = array.FirstOrDefault();
}
catch (Exception)
{
//LOG
result = default(T);
}
}
catch (Exception)
{
//LOG
result = default(T);
}
return result;
}
#endregion #region Public Extend Methods /// <summary>
/// 反序列化JSON数据为dynamic对象
/// <para>如果发生JsonSerializationException异常,再以集合的方式重试一次,取出集合的第一个dynamic对象。</para>
/// <para>转换失败,或发生其它异常,则返回dynamic对象的默认值</para>
/// </summary>
/// <param name="json">需要反序列化的JSON字符串</param>
/// <returns>dynamic对象</returns>
public static dynamic FromJson(this string json)
{
return FromJson<dynamic>(json, Formatting.None, JsonSettings);
} /// <summary>
/// 反序列化JSON数据到指定的.NET类型对象
/// <para>如果发生JsonSerializationException异常,再以集合的方式重试一次,取出集合的第一个T对象。</para>
/// <para>转换失败,或发生其它异常,则返回T对象的默认值</para>
/// </summary>
/// <param name="json">需要反序列化的JSON字符串</param>
/// <typeparam name="T">反序列化对象的类型</typeparam>
/// <returns></returns>
public static T FromJson<T>(this string json) where T : class, new()
{
return FromJson<T>(json, Formatting.None, JsonSettings);
} /// <summary>
/// 应用默认的Formatting枚举值None和默认的JsonSerializerSettings设置,序列化对象到JSON格式的字符串
/// </summary>
/// <param name="obj">任意一个对象</param>
/// <returns>标准的JSON格式的字符串</returns>
public static string ToJson(this object obj)
{
return ToJson(obj, Formatting.None, JsonSettings);
} public static string ToJson<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(predicate), isFilterNull);
} public static string ToJson<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(predicate), isFilterNull);
} public static string ToJson<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(t => t != null).Select(selector), isFilterNull);
} public static string ToJson<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(t => t != null).Select(selector), isFilterNull);
} public static string ToJson<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, TResult> selector, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(predicate).Select(selector), isFilterNull);
} public static string ToJson<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, Func<TSource, int, TResult> selector, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(predicate).Select(selector), isFilterNull);
} public static string ToJson<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate, Func<TSource, TResult> selector, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(predicate).Select(selector), isFilterNull);
} public static string ToJson<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate, Func<TSource, int, TResult> selector, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => enumerable.Where(predicate).Select(selector), isFilterNull);
}
#endregion #region Private Methods /// <summary>
/// 委托处理需要序列化为JSON格式的对象,返回标准的JSON格式的字符串。
/// 默认过滤null对象,如果需要在上层调用时,自己进行条件过滤null对象,
/// 则设置isFilterNull为false,不建议isFilterNull设置为false。
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="TResult"></typeparam>
/// <param name="source">需要转换为JSON格式字符串的对象</param>
/// <param name="func">集合/数组条件筛选方法委托,返回筛选后的集合/数组</param>
/// <param name="isFilterNull">是否过滤IEnumerable<TSource> source中的null对象,默认为true</param>
/// <returns>标准的JSON格式的字符串</returns>
private static string DelegateToJson<TSource, TResult>(IEnumerable<TSource> source, Func<TSource[], IEnumerable<TResult>> func, bool isFilterNull = true)
{
return DelegateToJson(source, enumerable => func(enumerable).ToJson(), isFilterNull);
} /// <summary>
/// 委托处理需要序列化为JSON格式的对象,返回标准的JSON格式的字符串。
/// 默认过滤null对象,如果需要在上层调用时,自己进行条件过滤null对象,
/// 则设置isFilterNull为false,不建议isFilterNull设置为false。
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <param name="source">需要转换为JSON格式字符串的对象</param>
/// <param name="func">JSON处理方法委托,返回JSON格式的字符串</param>
/// <param name="isFilterNull">是否过滤IEnumerable<TSource> source中的null对象,默认为true</param>
/// <returns>标准的JSON格式的字符串</returns>
private static string DelegateToJson<TSource>(IEnumerable<TSource> source, Func<TSource[], string> func, bool isFilterNull = true)
{
if (source == null)
{
return EmptyJson;
} TSource[] enumerable;
if (isFilterNull)
{
//过滤null
enumerable = source.Where(t => t != null).ToArray();
}
else
{
//不过滤null,但上层需要注意内里面有null对象时,可能会导致Where或Select引发异常。
enumerable = source as TSource[] ?? source.ToArray();
} return enumerable.Any() ? func(enumerable) : EmptyJson;
} #endregion
}
}

用法案例:

class Program
{
static void Main(string[] args)
{
//ToJson 方法 Test
#region 默认过滤null对象 var list1 = new List<Test>
{
new Test {Id = 10, Type = 21, Name="Allen"},
new Test {Id = 11, Type = 22},
new Test {Id = 12, Type = 23},
new Test {Id = 13, Type = 24, Name="Peter"},
null,
new Test {Id = 13, Type = 24, Name=null}
}; //指定json数据所需要的属性
string jsonString = list1.ToJson(t => new { id = t.Id, type = t.Type }); //推荐写法,连true都省略掉
//string jsonString = JsonHelper.ToJson(list1, t => new { id = t.Id, type = t.Type }); //不推荐该写法
//string jsonString = list1.ToJson(t => new { id = t.Id, type = t.Type }, true);
Console.WriteLine(jsonString); //筛选出Name为"Allen"的对象
string jsonString2 = list1.ToJson(t => t.Name == "Allen"); //推荐写法,连true都省略掉
//string jsonString2 = JsonHelper.ToJson(list1, t => t.Name == "Allen"); //不推荐该写法
//string jsonString2 = list1.ToJson(t => t.Name == "Allen", true);
Console.WriteLine(jsonString2); //筛选出Name为"Allen"的对象,并且指定json数据所需要的属性
string jsonString3 = list1.ToJson(t => t.Name == "Allen", t => new { id = t.Id, type = t.Type }); //推荐写法,连true都省略掉
//string jsonString3 = JsonHelper.ToJson(list1, t => t.Name == "Allen", t => new { id = t.Id, type = t.Type }); //不推荐该写法
//string jsonString3 = list1.ToJson(t => t.Name == "Allen", t => new { id = t.Id, type = t.Type }, true);
Console.WriteLine(jsonString3);
#endregion #region 不过滤null对象 var list2 = new List<Test>
{
new Test {Id = 10, Type = 21, Name="Allen"},
new Test {Id = 11, Type = 22, Name="Bolong"},
new Test {Id = 12, Type = 23, Name="Popo"},
new Test {Id = 13, Type = 24, Name="Peter"},
new Test {Id = 16, Type = 25, Name="Willy"}
}; //指定json数据所需要的属性
string jsonString4 = list2.ToJson(t => new { id = t.Id, type = t.Type }, false);
Console.WriteLine(jsonString4); //筛选出Name为"Allen"的对象
string jsonString5 = list2.ToJson(t => t.Name == "Allen", false);
Console.WriteLine(jsonString5); //筛选出Name为"Allen"的对象,并且指定json数据所需要的属性
string jsonString6 = list2.ToJson(t => t.Name == "Allen", t => new { id = t.Id, type = t.Type }, false);
Console.WriteLine(jsonString6);
#endregion //FromJson<T> 方法 Test
List<Test> testList1 = jsonString.FromJson<List<Test>>();
List<Test> testList2 = jsonString2.FromJson<List<Test>>();
Test test = jsonString3.FromJson<Test>(); //弱类型 Test
var test2 = jsonString.FromJson();
Newtonsoft.Json.Linq.JArray test3 = test2; Console.ReadKey();
}
} internal class Test
{
public int Type { get; set; } public int Id { get; set; } public string Name { get; set; }
}

PS:有更好的封装建议吗?

JSON扩展类——JsonHelper的更多相关文章

  1. C# json帮助类,JsonHelper,Table转JSon,JSon转Table

    /// <summary> /// json帮助类 /// </summary> public class JsonHelper { public JsonHelper() { ...

  2. ASP.NET(C#) Json序列化反序列化帮助类Jsonhelper

    原文地址:https://ken.io/note/csharp-asp.net-jsonhelper using System; using System.Collections.Generic; u ...

  3. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  4. Spring统一返回Json工具类,带分页信息

    前言: 项目做前后端分离时,我们会经常提供Json数据给前端,如果有一个统一的Json格式返回工具类,那么将大大提高开发效率和减低沟通成本. 此Json响应工具类,支持带分页信息,支持泛型,支持Htt ...

  5. C#封装的一个JSON操作类

    using System; using System.Collections.Generic; using System.Collections; using System.Text; using S ...

  6. UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

    UIManage单实例: /// 单例模式的核心 /// 1,定义一个静态的对象 在外界访问 在内部构造 /// 2,构造方法私有化 private static UIManager _instanc ...

  7. Android Json转换类对象,并使用

    长话短说,先上代码(今天的代码是有史以来最短的)(今天的课也是有史以来最精简...) 然后就是介绍Song是啥,上面的网站应该知道,是网易云的,不过为啥会变成这样,因为这是网易云的API网站 反正就是 ...

  8. [No00009A]JsonToObject json与类互转

    using System.Web.Script.Serialization; /// <summary> /// 内部类,保存jsonData /// </summary> p ...

  9. C# 扩展类

    C# 中提供一个非常实用的供能,扩展方法(Extension method) 扩展方法是通过额外的静态方法扩展现有的类型.通过扩展方法,可以对已有类型做自己想做的相关扩展.方法:定义静态类,扩展方法也 ...

随机推荐

  1. Hawk 4.4 执行器

    执行器是负责将Hawk的结果传送到外部环境的工具.你可以写入数据表,数据库,甚至执行某个特定的动作,或是生成文件等等. 在调试模式下,执行器都是不工作的.这是为了避免产生副作用.否则,每刷新一遍数据, ...

  2. JS的内建函数reduce

    @(js) reduce函数,是ECMAScript5规范中出现的数组方法.在平时的工作中,相信大家使用的场景并不多,一般而言,可以通过reduce方法实现的逻辑都可以通过forEach方法来变相的实 ...

  3. Java实现Excel中的NORMSDIST函数和NORMSINV函数

    由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...

  4. DDD领域驱动设计 - 设计文档模板

    设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...

  5. PHP设计模式(四)单例模式(Singleton For PHP)

    今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...

  6. javascript高性能编程-算法和流程控制

          代码整体结构是执行速度的决定因素之一. 代码量少不一定运行速度快, 代码量多也不一定运行速度慢. 性能损失与代码组织方式和具体问题解决办法直接相关.       倒序循环可以提高性能,如: ...

  7. “风投云涌”:那些被资本看中的IT企业的风光与辛酸

         进入七月份以来,纷享销客获得D轮融资1亿美元,撼动业界,资本与IT联姻令一部分创业者眼红的同时,没有人注意到背后的风险. 科技与资本的结合,是当今经济社会前行的宏大主题.相关统计显示,软件行 ...

  8. Atitit.研发团队的管理原则---立长不立贤与按资排辈原则

    Atitit.研发团队的管理原则---立长不立贤与按资排辈原则 1. 组织任命原则概述1 2. 历史的角度看,大部分组织使用的立长不立贤原则1 3. 论资排辈 立长不立贤原则1 3.1. 资格和辈分是 ...

  9. Python学习基础

    1.使用范围: 大数据 .图像处理.web .运维.爬虫.自动化.科学计算 2.准备环境: linux/mac python 3.5.2 ipython vim/sublime/atom 3.列表 3 ...

  10. 微软.Net 社区虚拟大会 -- 首日重点(dotnetConf 2016)

    6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开. 在 Scott Hunter, Miguel de Icaza (Xamarin CTO) , ScottHan ...