[Json.net]快速入门
引言
有个朋友问了一个如何更方便的解析json格式字符串,之前也没怎么研究过json.net,就上网帮他查了一下,现学现卖的给他整了一个demo,这才发现json.net的强大,用着很方便。
Json
JSON(javasrcipt Object Notation)是一种轻量级的数据交换方式。拿最常见的应用举个例子,将javascript对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松的传递这个字符串,或者在异步应用程序中将字符串从web客户机传递给服务端程序。这个字符串虽然看起来比较古怪,但是javascript很容易解释它,而且json可以表示比“名称/值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
在.net中,DataContractJsonSerializer和JavaScriptSerializer这两个类,可以操作json。但性能上和json.net相比,差了很多。
可以借用官网的一张图看一下:
官网地址:http://james.newtonking.com/json
将下载的压缩文件解压,Source是源码文件夹,在bin目录下,Newtonsoft.Json.dll是编译后的程序集文件,在项目中应用该dll就行了。
Json.net
在项目中引用Newtonsoft.Json.dll。
首先从最简单的例子入手,序列化DataTable对象。
引入命名空间:
using Newtonsoft.Json;
测试代码:
using Newtonsoft.Json;
using System.Data;
namespace Wolfy.JsonNetDemo
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
DataColumn name = new DataColumn("Name");
DataColumn gender = new DataColumn("Gender");
DataColumn address = new DataColumn("Address");
dt.Columns.Add(name);
dt.Columns.Add(gender);
dt.Columns.Add(address);
for (int i = ; i < ; i++)
{
DataRow dr = dt.NewRow();
dr[] = "Name" + i;
dr[] = i%==?"男":"女";
dr[] = "Address" + i;
dt.Rows.Add(dr);
}
//序列化为json
string json = JsonConvert.SerializeObject(dt);
Console.WriteLine(json);
Console.Read();
}
}
}
结果:
反序列化为Datatable
DataTable dt1 = JsonConvert.DeserializeObject<DataTable>(json);
for (int i = ; i < dt1.Rows.Count; i++)
{
DataRow dr = dt1.Rows[i];
Console.WriteLine("{0}\t{1}\t{2}\t", dr[], dr[], dr[]);
}
控制
实现对Json.net序列化和反序列化的控制,需要JsonSerializerSettings类。
var jsonSetting = new JsonSerializerSettings(); string json=JsonConvert.SerializeObject(object,jsonSetting);
新建一个测试类:
public class Employee
{
public string Name { get; set; }
public int Age { set; get; }
public string Gender { set; get; }
public string DepartmentName { set; get; }
public Employee Leader { set; get; }
}
空值处理
针对应用类型,如果为NULL时,json.net如何处理,可以通过 jsonSetting.NullValueHandling的值来控制。如:
var jsonSetting = new JsonSerializerSettings();
jsonSetting.NullValueHandling = NullValueHandling.Ignore;
jsonSetting.NullValueHandling = NullValueHandling.Include;
一个例子:
Employee employee = new Employee();
employee.Name = "Wolfy";
employee.Gender = "男";
employee.Age = ;
employee.DepartmentName = ".net开发";
employee.Leader = null;
var jsonSetting = new JsonSerializerSettings();
jsonSetting.NullValueHandling = NullValueHandling.Ignore;
string json = JsonConvert.SerializeObject(employee,jsonSetting);
Console.WriteLine(json);
Console.Read();
结果:
改为NullValueHandling.Include
结果:
默认值处理
对于值类型的处理,通过设置jsonSetting.DefaultValueHandling的值来确定。同样是枚举可取Ignore,Include等,如:
namespace Newtonsoft.Json
{
[Flags]
public enum DefaultValueHandling
{
Include = ,
Ignore = ,
Populate = ,
IgnoreAndPopulate = ,
}
}
jsonSetting.DefaultValueHandling = DefaultValueHandling.Ignore;//忽略默认值
给Employee的成员使用特性 [DefaultValue(26)]设置默认值,并引入命名空间:System.ComponentModel
[DefaultValue()] public int Age { set; get; }
忽略默认值:
Employee employee = new Employee();
employee.Name = "Wolfy";
employee.Gender = "男";
employee.Age = ;
employee.DepartmentName = ".net开发";
employee.Leader = null;
var jsonSetting = new JsonSerializerSettings();
jsonSetting.NullValueHandling = NullValueHandling.Include;
jsonSetting.DefaultValueHandling = DefaultValueHandling.Ignore;//忽略默认值
string json = JsonConvert.SerializeObject(employee,jsonSetting);
Console.WriteLine(json);
Console.Read();
结果:
属性控制
Json.net序列化的两种方式:OptOut和OptIn
OptOut默认值,类中所有公共成员会被序列化,如果不想被序列化,可以使用特性JsonIgnore
OptIn默认情况下,所有的成员不会被序列化,类中的成员只有标有特性JsonProperty的才会被序列化,当类的成员很多,但客户端仅仅需要一部分时很有帮助。
using Newtonsoft.Json;
namespace Wolfy.JsonNetDemo
{
[JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
public class Employee
{
[JsonProperty]
public string Name { get; set; } public int Age { set; get; }
public string Gender { set; get; }
public string DepartmentName { set; get; }
public Employee Leader { set; get; }
}
}
序列化:
Employee employee = new Employee();
employee.Name = "Wolfy";
employee.Gender = "男";
employee.Age = ;
employee.DepartmentName = ".net开发";
employee.Leader = null;
string json = JsonConvert.SerializeObject(employee);
Console.WriteLine(json);
结果:
如果想忽略某个属性,比如忽略领导信息。则可以这样写:
namespace Wolfy.JsonNetDemo
{
[JsonObject(Newtonsoft.Json.MemberSerialization.OptOut)]
public class Employee
{
public string Name { get; set; } public int Age { set; get; }
public string Gender { set; get; }
public string DepartmentName { set; get; }
[JsonIgnore]
public Employee Leader { set; get; }
}
}
[JsonObject(Newtonsoft.Json.MemberSerialization.OptOut)]可以不写,已经默认
测试:
Employee employee = new Employee();
employee.Name = "Wolfy";
employee.Gender = "男";
employee.Age = ;
employee.DepartmentName = ".net开发";
employee.Leader = new Employee() {Name = "老大",Gender = "男",Age = , DepartmentName = ".net开发"};
string json = JsonConvert.SerializeObject(employee);
Console.WriteLine(json);
结果:
不忽略结果对比:
非公共成员序列化
Json.net序列化对象,默认只序列化公共成员,非公共成员序列互时,需加上 [JsonProperty]特性。
日期处理
两种日期格式:IsoDateTimeConverter和JavaScriptDateTimeConverter
这是json.net中带的2个日期类,默认是IsoDateTimeConverter,格式“yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK”。另一个是JavaScriptDateTimeConverter,格式“new Date(ticks)”,返回Javascript的Date对象。
一个例子
public class Employee
{
public string Name { get; set; }
public int Age { set; get; }
public string Gender { set; get; }
public string DepartmentName { set; get; }
//[JsonIgnore]
public Employee Leader { set; get; }
public DateTime BirthDay { set; get; }
public DateTime EmployeDate { set; get; }
}
序列化为Javascript格式:
Employee employee = new Employee();
employee.Name = "Wolfy";
employee.Gender = "男";
employee.Age = ;
employee.DepartmentName = ".net开发";
employee.Leader = new Employee() {Name = "老大",Gender = "男",Age = , DepartmentName = ".net开发"};
employee.BirthDay = new DateTime(,,);
employee.EmployeDate = new DateTime(,,);
string json = JsonConvert.SerializeObject(employee,new JavaScriptDateTimeConverter());
Console.WriteLine(json);
序列化
如果想要不同的日期类型成员序列化后,以不同的形式显示。
则可以通过设置特性实现
public class Employee
{
public string Name { get; set; }
public int Age { set; get; }
public string Gender { set; get; }
public string DepartmentName { set; get; }
//[JsonIgnore]
public Employee Leader { set; get; }
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime BirthDay { set; get; }
[JsonConverter(typeof(JavaScriptDateTimeConverter))]
public DateTime EmployeDate { set; get; }
}
结果:
自定义日期格式:
IsoDateTimeConverter newFormatTime = new IsoDateTimeConverter() { DateTimeFormat="yyyy年MM月dd日"};
string json = JsonConvert.SerializeObject(employee, newFormatTime);
Console.WriteLine(json);
结果:
总结
json.net简单操作就介绍到这里,之后总结Linq to json的用法。
参考
http://james.newtonking.com/json
http://www.360doc.com/content/13/0328/22/11741424_274568478.shtml
[Json.net]快速入门的更多相关文章
- webpack快速入门——Json配置文件使用
在实际工作中,我们的项目都会配置一个Json的文件或者说API文件,作为项目的配置文件. 有时候你也会从后台读取到一个json的文件,这节课就学习如何在webpack环境中使用Json. 如果你会we ...
- npm 与 package.json 快速入门教程
npm 与 package.json 快速入门教程 2017年08月02日 19:16:20 阅读数:33887 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解 ...
- [转载]npm 与 package.json 快速入门教程
npm 与 package.json 快速入门教程 2017-08-02 19:16:20 拭心 阅读数 78648更多 分类专栏: 学学前端 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- npm与package.json快速入门
本文转载自npm与package.json快速入门 导语 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- grunt快速入门
快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...
- [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门
一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...
- [你必须知道的NOSQL系列]专题一:MongoDB快速入门
一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部分 ...
- AngularJS快速入门指南20:快速参考
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
随机推荐
- nginx 做负载均衡
最近正在研究Nginx,Nginx作为反向代理服务器,可以对Web服务器提供加速,并且具有负载均衡的功能. 首先我要在官网下载Nginx(http://nginx.org/en/download.ht ...
- JavaScript中的直接量与初始器的区别
很多代码优化及公司规范都会提到 写对象不应该 var obj = new Object() 而应该 var obj = {} 写数组不应该 var arr = new Array() 而应该 var ...
- hdu 4635 Strongly connected 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
- Linux SELinux命令
getsebool与setsebool工具 说明:SELinux规范了许多boolean数值清单档案,提供开启或关闭功能存取项目,而这些值都存放在/selinux/booleans/目录内相关档案,这 ...
- phpcms v9调用多个栏目下文章的方法
示例:{pc:get sql="SELECT * from v9_news where status=99 and catid in(6,7,8) order by id DESC" ...
- hdu-1789-Doing Homework again
/* Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 移动web页面使用的字体的思考
前言 记得做PC端页面的时候,字体一般设置为微软雅黑,现在做起移动端页面来了,设计师们一般都还把字体设置为微软雅黑字体,但是做出来后,测试的时候发现页面中的字体不是微软雅黑,怎么办? 后来了解到的手机 ...
- java11-1 最常见的类 String类
字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. 通过查看API,可以知道 A:字符串字面值"abc"也可以看成是一个字符串对象. B:字符串是常量,一旦被赋值,就 ...
- 转: java学习路线图
http://www.java1234.com/javaxuexiluxiantu.html
- PCTF-2016-WEB
Pctf ** web100 PORT51** 开始看到这个真的无法下手,想过用python–socket编程或者scapy发包.自己觉得是可以的,但是没有去试,后面看一大神writeup,知道: ...