引言

有个朋友问了一个如何更方便的解析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. hdu 2196 Computer 树形dp模板题

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. linux进程间通信-XSI IPC

    一 什么是XSI IPC     有三种 IPC我们称作XSI IPC,即消息队列.信号量以及共享存储器(共享内存),它们之间有很多相似之处. 二 标识符和键     每个内核中的 IPC结构(消息队 ...

  3. Linux学习之三——操作档案与目录

    一. 目录文档操作指令 1. pwd 显示目前所在目录 如果加上-P 的选项,则取得正确的目录名称,而不是以链接文件的路径来显示. 例如CentOS下,刚刚好/var/mail是/var/spool/ ...

  4. Icacls 在windows目录文件授权中的应用

    前言 最近因工作需要,需要对批量服务器某一目录下的文件进行统一授权,对于linux来说,授权很方便,对于window来说,要对目录下的文件进行批量授权还是很不方便的,windows平台授权自然想到用i ...

  5. java帮助文档下载

    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和 ...

  6. LeetCode 3 Longest Substring Without Repeating Characters 解题报告

    LeetCode 第3题3 Longest Substring Without Repeating Characters 首先我们看题目要求: Given a string, find the len ...

  7. 【ASP.NET 进阶】无刷新上传图片之一:利用一般处理程序

    效果图: 源代码地址:https://github.com/YeXiaoChao/UploadThePic

  8. 第05篇. Tomcat和JDK的内存配置

    站在人群,我毫不起眼:活在世上,我不玩心眼! 没有那么远大的目标,但是也不要把我当成傻子! --胖先生 放在前面要说的话:JVM内存分配设置的参数有四个 -Xmx Java Heap最大值,默认值为物 ...

  9. POJ 3481Double Queue Splay

    #include<stdio.h> #include<string.h> ; ],data[N],id[N],fa[N],size,root; void Rotate(int ...

  10. AC日记——逃跑的拉尔夫 codevs 1026 (搜索)

    1026 逃跑的拉尔夫  时间限制: 1 s    空间限制: 128000 KB    题目等级 : 黄金 Gold 题解       题目描述 Description   年轻的拉尔夫开玩笑地从一 ...