.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询。目前已被微软集成于webapi框架之中,因此,熟练掌握JSON.NET相当重要,这篇文章是零度参考官网整理的示例,通过这些示例,可以全面了解JSON.NET提供的功能。
Newtonsoft.Json的地址:
源码地址:https://github.com/JamesNK/Newtonsoft.Json
Newtonsoft.Json.dll下载:https://github.com/JamesNK/Newtonsoft.Json/releases
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<string> { "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<string> Roles { get; set; }
}
执行结果:

2、使用Newtonsoft.Json(JSON.NET)序列化List集合:
List<string> videogames = new List<string> { "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<string, string> dic = new System.Collections.Generic.Dictionary<string, string>
{
{ "Name", "张三" },
{ "Age", "" },
{ "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 = };
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<JosnEnum> list = new List<JosnEnum> { JosnEnum.NotStartus, JosnEnum.Startus };
string json = Newtonsoft.Json.JsonConvert.SerializeObject(list);
Console.WriteLine(json);
Console.WriteLine("");
System.Collections.Generic.Dictionary<string, int> dic = new System.Collections.Generic.Dictionary<string, int>
{
{((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<JosnEnum> list2 = new List<JosnEnum>
{
JosnEnum.NotStartus,
JosnEnum.Startus
};
string json3 = Newtonsoft.Json.JsonConvert.SerializeObject(list2, new Newtonsoft.Json.Converters.StringEnumConverter());
Console.WriteLine(json3);
Console.WriteLine("");
List<JosnEnum> result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<JosnEnum>>(json3, new Newtonsoft.Json.Converters.StringEnumConverter());
Console.WriteLine(string.Join(", ", result.Select(c => c.ToString())));
public enum JosnEnum
{
NotStartus = ,
Startus =
}
执行结果:

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<Account>(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<string> Roles { get; set; }
}
执行结果:

8、使用Newtonsoft.Json(JSON.NET)反序列化List集合:
string json = @"['Html5','C#','.Net','.Net Core']";
List<string> videogames = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(json);
Console.WriteLine(string.Join(", ", videogames));
执行结果:

9、使用Newtonsoft.Json(JSON.NET)反序列化dictionary字典
string json = @"{'Name': '张三','Age': '23'}";
var htmlAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
Console.WriteLine(htmlAttributes["Name"]);
Console.WriteLine(htmlAttributes["Age"]);
执行结果:

10、使用Newtonsoft.Json(JSON.NET)序列化var匿名类型,有时候,我们并不需要先定义一个类,然后new一个对象后再进行序列化,JSON.NET支持匿名类型的序列化和反序列化。
var test1 = new { Name = "李四", Age = };
var json = Newtonsoft.Json.JsonConvert.SerializeObject(test1);
Console.WriteLine(json);
Console.WriteLine("");
var test2 = new { Name = "", Age = };
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<string> { "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<string> 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<Website>(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<Users>(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 = };
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 = };
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 =
};
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 = )]
public string FirstName { get; set; } [Newtonsoft.Json.JsonProperty(Order = )]
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<Order>(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);
执行结果:

.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程的更多相关文章
- C#将对象序列化成JSON字符串
C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...
- 将Java对象序列化成JSON和XML格式
1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...
- C#对象序列化成XML,以及自定义标签名
C#对象序列化操作: public class XMLHelper { /// <summary> /// 对象序列化成 XML String /// </summary> p ...
- ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据
原理: 0.创建一个新的可变字典:NSMutableDictionary 1.采用class_copyPropertyList函数遍历对象的属性 2.property_getName获取属性名,val ...
- Java对象的序列化与反序列化-Json篇
说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...
- 对象序列化成Json字符串 及 反序列化成对象
一. public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ...
- C#实体对象序列化成Json并让字段的首字母小写的两种解决方法
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- C#实体对象序列化成Json,并让字段的首字母小写
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- C#实体对象序列化成Json,格式化,并让字段的首字母小写
解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性) public class UserInfo { [JsonProperty(& ...
随机推荐
- 【原】nodejs全局安装和本地安装的区别
来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...
- Intel Media SDK H264 encoder GOP setting
1 I帧,P帧,B帧,IDR帧,NAL单元 I frame:帧内编码帧,又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随 ...
- 在jekyll模板博客中添加网易云模块
最近使用GitHub Pages + Jekyll 搭建了个人博客,作为一名重度音乐患者,博客里面可以不配图,但是不能不配音乐啊. 遂在博客里面引入了网易云模块,这里要感谢网易云的分享机制,对开发者非 ...
- ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案
好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...
- Twproject Gantt开源甘特图功能扩展
1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...
- 从display:run-in;中学习新技能
有时我们想在一行内显示一个标题,以及一段内容,虽然看起来比较简单,但是为了语义化用dl比较合适,但是它默认是block元素,改成inline?那么有多段呢?不就都跑上来了?用float?那问题也挺多. ...
- iOS 委托与文本输入(内容根据iOS编程编写)
文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑 JXHypnosisViewController.m 修改 loadView 方法,向 ...
- WebApi返回Json格式字符串
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...
- MSYS2环境下编译X265
HEVC(High Efficiency Video Coding),是一种新的视频压缩标准.可以替代H.264/ AVC编码,使得保持相同质量的情况下,体积减少40%左右.目前有多种实现版本,x26 ...
- js 入门级常见问题
写在前面:以下是个人总结的关于js常见的入门级的问题一些总结. js是有 ECMAScript Dom Bom 三部分组成. 1,undefined,NaN,Null,infinity 1) unde ...