博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
阅读量:5873 次
发布时间:2019-06-19

本文共 16389 字,大约阅读时间需要 54 分钟。

JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询。目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能。

Newtonsoft.Json的地址:

官网:

源码地址:

Newtonsoft.Json.dll下载:

1、使用Newtonsoft.Json(JSON.NET)序列化对象,通过Newtonsoft.Json.Formatting将json格式化输出。

Account account = new Account            {                Email = "1930906722@qq.com",                Active = true,                CreatedDate =DateTime.Now,                Roles = new List
{ "User", "Admin" } }; string json = Newtonsoft.Json.JsonConvert.SerializeObject(account, Newtonsoft.Json.Formatting.Indented); Console.WriteLine(json);
public class Account    {        public string Name { get; set; }        public string Email { get; set; }        public bool Active { get; set; }        public DateTime CreatedDate { get; set; }        public IList
Roles { get; set; } }

执行结果:

2、使用Newtonsoft.Json(JSON.NET)序列化List集合:

List
videogames = new List
{ "HTML5", "JavaScript", ".net","c#",".net core" }; string json = Newtonsoft.Json.JsonConvert.SerializeObject(videogames); Console.WriteLine(json);

执行结果:

3、使用Newtonsoft.Json(JSON.NET)序列化dictionary字典

System.Collections.Generic.Dictionary
dic = new System.Collections.Generic.Dictionary
{ { "Name", "张三" }, { "Age", "20" }, { "Email", "193090622@qq.com" } }; string json1 = Newtonsoft.Json.JsonConvert.SerializeObject(dic, Newtonsoft.Json.Formatting.Indented); Console.WriteLine(json1); Console.WriteLine(""); Console.WriteLine("未格式化的json:"); string json2 = Newtonsoft.Json.JsonConvert.SerializeObject(dic, Newtonsoft.Json.Formatting.None); Console.WriteLine(json2);

执行结果:

4、Newtonsoft.Json(JSON.NET)将序列化结果保存到指定的文件:

User movie = new User { Name = "张三", Age = 1993 };            using (System.IO.StreamWriter file = System.IO.File.CreateText(@"F:\UserInfo.txt"))            {                Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer();                serializer.Serialize(file, movie);            }
public class User    {        public string Name { set; get; }        public int Age { set; get; }    }

执行后保存到文件的结果:

5、Newtonsoft.Json(JSON.NET)基于枚举类型的JsonConverters转换器

List
list = new List
{ JosnEnum.NotStartus, JosnEnum.Startus }; string json = Newtonsoft.Json.JsonConvert.SerializeObject(list); Console.WriteLine(json); Console.WriteLine(""); System.Collections.Generic.Dictionary
dic = new System.Collections.Generic.Dictionary
{ {((JosnEnum)(int)JosnEnum.NotStartus).ToString() ,(int)JosnEnum.NotStartus} , {((JosnEnum)(int)JosnEnum.Startus).ToString() ,(int)JosnEnum.Startus} }; string dicJson = Newtonsoft.Json.JsonConvert.SerializeObject(dic); Console.WriteLine(dicJson); Console.WriteLine(""); List
list2 = new List
{ JosnEnum.NotStartus, JosnEnum.Startus }; string json3 = Newtonsoft.Json.JsonConvert.SerializeObject(list2, new Newtonsoft.Json.Converters.StringEnumConverter()); Console.WriteLine(json3); Console.WriteLine(""); List
result = Newtonsoft.Json.JsonConvert.DeserializeObject
>(json3, new Newtonsoft.Json.Converters.StringEnumConverter()); Console.WriteLine(string.Join(", ", result.Select(c => c.ToString())));
public enum JosnEnum    {        NotStartus = 0,        Startus = 1    }

执行结果:

6、Newtonsoft.Json(JSON.NET)通过JRaw将JS函数序列化到JSON中

JavaScriptSettings settings = new JavaScriptSettings            {                OnLoadFunction = new Newtonsoft.Json.Linq.JRaw("OnLoad"),                OnSucceedFunction = new Newtonsoft.Json.Linq.JRaw("function(e) { alert(e); }")            };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(settings, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(json);
public class JavaScriptSettings    {        public Newtonsoft.Json.Linq.JRaw OnLoadFunction { get; set; }        public Newtonsoft.Json.Linq.JRaw OnSucceedFunction { get; set; }    }

7、使用Newtonsoft.Json(JSON.NET)将json反序列化对象

string json = @"{   'Email': '1930906722@qq.com',   'Active': true,   'CreatedDate': '2016-11-26 20:39',   'Roles': [     'User',     'Admin'] }";            Account account = Newtonsoft.Json.JsonConvert.DeserializeObject
(json); Console.WriteLine(account.Email);
public class Account    {        public string Name { get; set; }        public string Email { get; set; }        public bool Active { get; set; }        public DateTime CreatedDate { get; set; }        public IList
Roles { get; set; } }

执行结果:

8、使用Newtonsoft.Json(JSON.NET)反序列化List集合:

string json = @"['Html5','C#','.Net','.Net Core']";            List
videogames = Newtonsoft.Json.JsonConvert.DeserializeObject
>(json); Console.WriteLine(string.Join(", ", videogames));

执行结果:

9、使用Newtonsoft.Json(JSON.NET)反序列化dictionary字典

string json = @"{'Name': '张三','Age': '23'}";            var htmlAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject
>(json); Console.WriteLine(htmlAttributes["Name"]); Console.WriteLine(htmlAttributes["Age"]);

执行结果:

10、使用Newtonsoft.Json(JSON.NET)序列化var匿名类型,有时候,我们并不需要先定义一个类,然后new一个对象后再进行序列化,JSON.NET支持匿名类型的序列化和反序列化。

var test1 = new { Name = "李四", Age = 26 };            var json = Newtonsoft.Json.JsonConvert.SerializeObject(test1);            Console.WriteLine(json);            Console.WriteLine("");            var test2 = new { Name = "", Age = 0 };            string json1 = @"{'Name':'张三','Age':'25'}";            var result = Newtonsoft.Json.JsonConvert.DeserializeAnonymousType(json1, test2);            Console.WriteLine(result.Name);

执行结果:

11、Newtonsoft.Json(JSON.NET)用新JSON字符串填充指定对象的属性值

Account account = new Account            {                Email = "1930906722@qq.com",                Active = true,                CreatedDate = DateTime.Now,                Roles = new List
{ "User", "Admin" } }; string json = @"{'Active': false, 'Roles': ['Expired']}"; Newtonsoft.Json.JsonConvert.PopulateObject(json, account); Console.WriteLine(account.Active); Console.WriteLine(account.Email);
public class Account    {        public string Name { get; set; }        public string Email { get; set; }        public bool Active { get; set; }        public DateTime CreatedDate { get; set; }        public IList
Roles { get; set; } }

执行结果:

12、使用Newtonsoft.Json(JSON.NET)反序列化时可指定构造函数:

首先我们定义如下的类型,我们希望JSON.NET反序列化对象时使用第2个构造函数,我们将第一个默认构造函数屏蔽,标记为私有private修饰符。第2个构造函数需要指定一个website对象作为参数,如果提供的参数为null则抛出异常:

public class Website{    public string Url { get; set; }    private Website()    {    }    public Website(Website website)    {        if (website == null) throw new ArgumentNullException("website");        Url = website.Url;    }}

现在使用一般的方式反序列化一个JSON字符串。执行出现的结果:

我们发现该序列化方法抛出了异常,并没有按照我们预想的方式进行反序列化,JSON.NET提供如下的方式指定公有构造函数。

string json = @"{'Url':'http://www.cnblogs.com/linJie1930906722/'}";            Website website = Newtonsoft.Json.JsonConvert.DeserializeObject
(json, new Newtonsoft.Json.JsonSerializerSettings { ConstructorHandling = Newtonsoft.Json.ConstructorHandling.AllowNonPublicDefaultConstructor }); Console.WriteLine(website.Url);

执行结果:

另外,JSON.NET提供了指定任何构造函数的JsonConstructorAttribute特性,只需要在构造函数上标记,即可指定构造函数。

public class Users    {        public string UserName { get; private set; }        public bool Enabled { get; private set; }        public Users()        {        }        [Newtonsoft.Json.JsonConstructor]        public Users(string userName, bool enabled)        {            UserName = userName;            Enabled = enabled;        }    }
string json = @"{""UserName"": ""希特勒"",""Enabled"": true}";            Users user = Newtonsoft.Json.JsonConvert.DeserializeObject
(json); Console.WriteLine(user.UserName);

执行结果:

13、当对象的属性为默认值(0或null)时不序列化该属性

public class Person    {        public string Name { get; set; }        public int Age { get; set; }        public Person Partner { get; set; }        public decimal? Salary { get; set; }    }
Person person1 = new Person();            string json1 = Newtonsoft.Json.JsonConvert.SerializeObject(person1, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings            {                DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore            });            Console.WriteLine(json1);            Console.WriteLine("");            Person person2 = new Person(){Name = "奥巴马"};            string json2 = Newtonsoft.Json.JsonConvert.SerializeObject(person2, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings            {                DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore            });            Console.WriteLine(json2);

执行结果:

14、Newtonsoft.Json(JSON.NET)中忽略null值得处理器

public class Person    {        public string Name { get; set; }        public int Age { get; set; }        public Person Partner { get; set; }        public decimal? Salary { get; set; }    }
Person person = new Person { Name = "张三", Age = 46 };            string jsonIncludeNullValues = Newtonsoft.Json.JsonConvert.SerializeObject(person, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(jsonIncludeNullValues);            Console.WriteLine("");            string json = Newtonsoft.Json.JsonConvert.SerializeObject(person, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings            {                NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore            });            Console.WriteLine(json);

执行结果:

15、JSON.NET中循环引用的处理方法

Employee employee1 = new Employee { Name = "张三" };            Employee employee2 = new Employee { Name = "李四" };            employee1.Manager = employee2;            employee2.Manager = employee2;            string json = Newtonsoft.Json.JsonConvert.SerializeObject(employee1, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings            {                ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore            });            Console.WriteLine(json);
public class Employee    {        public string Name { get; set; }        public Employee Manager { get; set; }    }

执行结果:

16、通过ContractResolver指定属性名首字母小写,通常,在.NET中属性采用PascalCase规则(首字母大写),在JavaScript中属性名使用CamelCase规则(首字母小写),我们希望序列化后的JSON字符串符合CamelCase规则,JSON.NET提供的ContractResolver可以设置属性名小写序列化

public class User    {        public string Name { set; get; }        public int Age { set; get; }    }
User person = new User { Name = "张三", Age =52 };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(person, Newtonsoft.Json.Formatting.Indented, new Newtonsoft.Json.JsonSerializerSettings            {                ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()            });            Console.WriteLine(json);

执行结果:

17、JSON.NET中通过特性序列化枚举类型

public enum ProductStatus    {         NotConfirmed,         Active, Deleted    }    public class Product    {        public string Name { get; set; }        [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]        public ProductStatus Status { get; set; }    }
Product user = new Product { Name = @"羽绒服", Status = ProductStatus.Deleted };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(user, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(json);

执行结果:

18、指定需要序列化的属性

[Newtonsoft.Json.JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]    public class Categroy    {        //Id不需要序列化        public Guid Id { get; set; }        [Newtonsoft.Json.JsonProperty]        public string Name { get; set; }        [Newtonsoft.Json.JsonProperty]        public int Size { get; set; }    }
Categroy categroy = new Categroy            {                Id = Guid.NewGuid(),                Name = "内衣",                Size = 52            };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(categroy, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(json);

执行结果:

19、序列化对象时指定属性名

public class Videogame    {        [Newtonsoft.Json.JsonProperty("name")]        public string Name { get; set; }        [Newtonsoft.Json.JsonProperty("release_date")]        public DateTime ReleaseDate { get; set; }    }
Videogame starcraft = new Videogame            {                Name = "英雄联盟",                ReleaseDate = DateTime.Now            };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(starcraft, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(json);

执行结果:

20、序列化时指定属性在JSON中的顺序

public class Personl    {        [Newtonsoft.Json.JsonProperty(Order = 2)]        public string FirstName { get; set; }        [Newtonsoft.Json.JsonProperty(Order = 1)]        public string LastName { get; set; }    }
Personl person = new Personl { FirstName = "张三", LastName = "李四" };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(person, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(json);

执行结果:

21、反序列化指定属性是否必须有值必须不为null,在反序列化一个JSON时,可通过JsonProperty特性的Required指定反序列化行为,当反序列化行为与指定的行为不匹配时,JSON.NET将抛出异常,Required是枚举,Required.Always表示属性必须有值切不能为null,Required.AllowNull表示属性必须有值,但允许为null值。

public class Order    {        [Newtonsoft.Json.JsonProperty(Required = Newtonsoft.Json.Required.Always)]        public string Name { get; set; }        [Newtonsoft.Json.JsonProperty(Required = Newtonsoft.Json.Required.AllowNull)]        public DateTime? ReleaseDate { get; set; }    }
string json = @"{    'Name': '促销订单',    'ReleaseDate': null  }";            Order order = Newtonsoft.Json.JsonConvert.DeserializeObject
(json); Console.WriteLine(order.Name); Console.WriteLine(order.ReleaseDate);

执行结果:

22、通过特性指定null值忽略序列化

public class Vessel    {        public string Name { get; set; }        [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]        public DateTime? LaunchDate { get; set; }    }
Vessel vessel = new Vessel { Name = "张三" };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(vessel, Newtonsoft.Json.Formatting.Indented);            Console.WriteLine(json);

执行结果:

23、忽略不需要序列化的属性,并不是对象所有属性都要参与序列化,我们可以使用JsonIgnore特性排除不需要序列化的属性,下面示例中的PasswordHash将被忽略。

public class Accounts    {        public string FullName { get; set; }        public string EmailAddress { get; set; }        [Newtonsoft.Json.JsonIgnore]        public string PasswordHash { get; set; }    }
Accounts account = new Accounts            {                FullName = "admin",                EmailAddress = "1930906722@qq.com",                PasswordHash = "dfsfgerhtyhsasdhjyujtgwe454811sfsg8d"            };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(account);            Console.WriteLine(json);

执行结果:

24、序列化或反序列化时指定日期时间格式,JSON.NET中提供一个名为JsonSerializerSettings的设置对象,可通过此对象设置很多序列化和反序列化的行为,如果要设置JSON.NET序列化输出的日期时间格式,只需要指定格式化字符串即可。通过JsonSerializerSettings的DateFormatString属性指定日期时间格式:

public class Customer    {        public string FirstName { get; set; }        public string LastName { get; set; }        public DateTime CreateDate { get; set; }    }
Customer custom = new Customer { FirstName = "张三", LastName = "李四", CreateDate = DateTime.Now };            Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings            {                DateFormatString = "yyyy-MM-dd HH:mm:ss",                Formatting = Newtonsoft.Json.Formatting.Indented            };            string json = Newtonsoft.Json.JsonConvert.SerializeObject(custom, settings);            Console.WriteLine(json);

执行结果:

 

转载于:https://www.cnblogs.com/linJie1930906722/p/6105620.html

你可能感兴趣的文章
决心书
查看>>
远程LInux和秘钥认证
查看>>
三层交换机启用OSPF后,如何实现数据转发路径
查看>>
MYSQL 的集群
查看>>
mongo 学习笔记之(基本命令)
查看>>
PHP扩展详解(一)
查看>>
at/cron计划任务初解
查看>>
自己第一阶段笔记
查看>>
初次使用nginx 搭建http2.0
查看>>
浅析下关于js的 逗号运算符 和 改变this指向 的一道题(mv to git)
查看>>
如何让nodejs在linux后台运行
查看>>
CentOS下LAMP一键yum安装脚本
查看>>
凤凰涅槃:从 iBatis 到 MyBatis
查看>>
Java开发者必须掌握的20个Spring常用注解
查看>>
无线AP网络覆盖两种组网方式
查看>>
死磕 java集合之TreeMap源码分析(一)- 内含红黑树分析全过程
查看>>
Nginx配置文件详细说明
查看>>
数据恢复的原理简介
查看>>
硬盘"动态磁盘 无法读取"故障的修复
查看>>
Linq并发冲突
查看>>