引言

有个朋友问了一个如何更方便的解析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]快速入门的更多相关文章

  1. webpack快速入门——Json配置文件使用

    在实际工作中,我们的项目都会配置一个Json的文件或者说API文件,作为项目的配置文件. 有时候你也会从后台读取到一个json的文件,这节课就学习如何在webpack环境中使用Json. 如果你会we ...

  2. npm 与 package.json 快速入门教程

    npm 与 package.json 快速入门教程 2017年08月02日 19:16:20 阅读数:33887 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解 ...

  3. [转载]npm 与 package.json 快速入门教程

    npm 与 package.json 快速入门教程 2017-08-02 19:16:20 拭心 阅读数 78648更多 分类专栏: 学学前端   版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  4. npm与package.json快速入门

    本文转载自npm与package.json快速入门 导语 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本 ...

  5. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

  7. [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门

    一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...

  8. [你必须知道的NOSQL系列]专题一:MongoDB快速入门

    一.前言 现在越来越多的公司开始采用非关系数据库了,并且很多公司的面试都要求面试者有MongoDB的使用经验,至于非关系数据库与关系型数据库之间的区别大家可以自行百度.但是作为程序员的我们,既然大部分 ...

  9. AngularJS快速入门指南20:快速参考

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

随机推荐

  1. nginx 做负载均衡

    最近正在研究Nginx,Nginx作为反向代理服务器,可以对Web服务器提供加速,并且具有负载均衡的功能. 首先我要在官网下载Nginx(http://nginx.org/en/download.ht ...

  2. JavaScript中的直接量与初始器的区别

    很多代码优化及公司规范都会提到 写对象不应该 var obj = new Object() 而应该 var obj = {} 写数组不应该 var arr = new Array() 而应该 var ...

  3. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

  4. Linux SELinux命令

    getsebool与setsebool工具 说明:SELinux规范了许多boolean数值清单档案,提供开启或关闭功能存取项目,而这些值都存放在/selinux/booleans/目录内相关档案,这 ...

  5. phpcms v9调用多个栏目下文章的方法

    示例:{pc:get sql="SELECT * from v9_news where status=99 and catid in(6,7,8) order by id DESC" ...

  6. hdu-1789-Doing Homework again

    /* Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...

  7. 移动web页面使用的字体的思考

    前言 记得做PC端页面的时候,字体一般设置为微软雅黑,现在做起移动端页面来了,设计师们一般都还把字体设置为微软雅黑字体,但是做出来后,测试的时候发现页面中的字体不是微软雅黑,怎么办? 后来了解到的手机 ...

  8. java11-1 最常见的类 String类

    字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. 通过查看API,可以知道 A:字符串字面值"abc"也可以看成是一个字符串对象. B:字符串是常量,一旦被赋值,就 ...

  9. 转: java学习路线图

    http://www.java1234.com/javaxuexiluxiantu.html

  10. PCTF-2016-WEB

    Pctf ** web100 PORT51**  开始看到这个真的无法下手,想过用python–socket编程或者scapy发包.自己觉得是可以的,但是没有去试,后面看一大神writeup,知道: ...