[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 ...
随机推荐
- Git :fatal: 错误提示解决办法
1-fatal: remote origin already exists. 1.先 $ git remote rm origin 2.再 $ git remote add origin git@g ...
- 第一次wubi安装Ubuntu的经历及所走的弯路
#安装目标:利用xp存储剩余空间安装ubuntu, 形成双系统. 整理出待安装的磁盘空间 #需要无损磁盘工具, 用了"傲梅分区助手", 偷懒没有选其他高大上的英文软件. XP下硬盘 ...
- linux设置tomcat开机启动
[root@iZ94j7ahvuvZ ~]# cd /etc/rc.d/ [root@iZ94j7ahvuvZ rc.d]# cat rc.local #!/bin/sh # # This scrip ...
- dw websites
http://www.kimballgroup.com/data-warehouse-business-intelligence-resources/kimball-techniques/dimens ...
- Linux登录出现modle is unknow
一.问题描述 登录linux系统发现控制台无法登录,即使输入正确用户名和密码,也无法登录,回车看到有一个错误“module is unknow”. 但是,ssh可以正常登录. 二.解决办法 ssh登录 ...
- [转]artDialog
本文转自:http://aui.github.io/artDialog/ http://aui.github.io/artDialog/doc/index.html artDialog —— 经典的网 ...
- UVA 11992 Fast Matrix Operations (二维线段树)
解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...
- Mybaits学习总结2
http://www.cnblogs.com/xdp-gacl/p/4262895.html 继续参考这篇文章写Mybaits学习总结 上一章,我修改了编码,统一为UTF8之后,便没有编码错误 < ...
- WebApi 返回小驼峰式 json 格式,并格式化日期
from:http://blog.csdn.net/magiccops/article/details/42969363 屏蔽默认返回xml格式:Global文件加:GlobalConfigurati ...
- iOS中使用RSA对数据进行加密解密
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0. ...