原文:http://wenku.baidu.com/link?url=3dlqKdF26ZdQIAcX9jvP2ZYEtl3J0sKOV8XuHQI0Rz4SjB9S46nqmGiMXUVQa_1PmUAVYWdFtWFkVP3ACT2SJ_xBZn8fVAynNTn6k1kYdnC#rd

官方帮助文档:http://james.newtonking.com/json/help/index.html

1. .NET对JSON的支持介绍 1

(1) 操作Json的DLL介绍 1

(2) 使用System.Web.Extensions.dll的限制 1

2. JSON序列化和反序列化 1

(1) 使用Newtonsoft.Json.dll实现 1

(2) 使用System.Web.Extensions.dll实现 2

(3) 使用System.Runtime.Serialization.dll实现 3

(4) 小结 5

3. 解析JSON字符串(使用Newtonsoft.Json.dll) 5

(1) 使用JsonTextReader类进行只进读取(不常用) 5

(2) 使用JArray、JObject、JToken进行读取(常用) 5

(3) Json时间字符串的处理 6

4. 读取Json字符串的技巧 6

(1) 使用匿名类 6

(2) 使用索引器 6

作者:李志伟

时间:2014-03-25

1..NET对JSON的支持介绍

(1)操作Json的DLL介绍

.NET自身有System.Runtime.Serialization.dll与System.Web.Extensions.dll,使用这两个DLL可以把对象序列化和反序列化成Json数据。

也可以使用第三方的Newtonsoft.Json.dll来操作Json数据,使用它会更方便的操作Json数据,其功能也跟强一些。下载地址:http://json.codeplex.com/

(2)使用System.Web.Extensions.dll的限制

要使用System.Web.Extensions.dll必须是在Web项目中,只有在Web项目中才能引用此DLL。

2.JSON序列化和反序列化

(1)使用Newtonsoft.Json.dll实现

代码示例:

public class Person

{

public string Name;//姓名

public bool Sex;//性别,是否是男

public Person(string name, bool sex)

{

this.Name = name;

this.Sex = sex;

}

public override string ToString()

{

return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

}

}

public class Programmer : Person

{

public List<string> Languages;//编程语言

public Programmer(string name, bool sex, List<string> languages) : base(name, sex)

{

this.Languages = languages;

}

public override string ToString()

{

StringBuilder str = new StringBuilder();

str.Append(base.ToString() + "\t编程语言:");

foreach (string l in this.Languages)

{

str.Append(l + " ");

}

return str.ToString();

}

}

class Program

{

static void Main(string[] args)

{

string filePath = @"D:\users\lizw\桌面\ObjectJson.txt";

List<string> languages = null;

List<Programmer> list = new List<Programmer>();

languages = new List<string>(new string[] { "C#", "Java" });

list.Add(new Programmer("李志伟", true, languages));

languages = new List<string>(new string[] { "C#", "C++" });

list.Add(new Programmer("Coder2", false, languages));

languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

list.Add(new Programmer("Coder3", true, languages));

//序列化对象

string jsonStr = JsonConvert.SerializeObject(list);//将对象转换成json存储

File.WriteAllText(filePath, jsonStr);

list.Clear();

//反序列化对象

list = JsonConvert.DeserializeObject<List<Programmer>>(jsonStr);

foreach (Programmer p in list)

{

Console.WriteLine(p);

}

Console.WriteLine("OK!");

Console.Read();

}

}

得到的Json文本:

[{"Languages":["C#","Java"],"Name":"李志伟","Sex":true},

{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},

{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]

注意:此种方式Json序列化对象时,只能序列化对象的公有成员。

(2)使用System.Web.Extensions.dll实现

代码示例:

public class Person

{

public string Name;//姓名

public bool Sex;//性别,是否是男

public Person() { }//必须有此构造方法,否者无法反序列化

public Person(string name, bool sex)

{

this.Name = name;

this.Sex = sex;

}

public override string ToString()

{

return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

}

}

public class Programmer : Person

{

public List<string> Languages;//编程语言

public Programmer() { }//必须有此构造方法,否者无法反序列化

public Programmer(string name, bool sex, List<string> languages)

: base(name, sex)

{

this.Languages = languages;

}

public override string ToString()

{

StringBuilder str = new StringBuilder();

str.Append(base.ToString() + "\t编程语言:");

foreach (string l in this.Languages)

{

str.Append(l + " ");

}

return str.ToString();

}

}

public partial class WebForm1 : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)//Web页面的加载事件

{

List<string> languages = null;

List<Programmer> list = new List<Programmer>();

languages = new List<string>(new string[] { "C#", "Java" });

list.Add(new Programmer("李志伟", true, languages));

languages = new List<string>(new string[] { "C#", "C++" });

list.Add(new Programmer("Coder2", false, languages));

languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

list.Add(new Programmer("Coder3", true, languages));

//序列化对象

JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();

string jsonStr = jsonSerialize.Serialize(list);//将对象转换成json存储

Response.Write(jsonStr + "<br>");//前台输出

//反序列化对象

list.Clear();

list = jsonSerialize.Deserialize<List<Programmer>>(jsonStr);

foreach (Programmer p in list)

{

Response.Write(p + "<br>");//前台输出

}

}

}

得到的Json文本:

[{"Languages":["C#","Java"],"Name":"李志伟","Sex":true},

{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},

{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]

注意:此种方式Json序列化对象时,除了只能序列化对象的公有成员外,被序列化的对象还必须有无参的构造方法才能被反序列化!System.Web.Extensions.dll只能在Web项目中引用,在控制台和WinFrom项目中无法引用!

(3)使用System.Runtime.Serialization.dll实现

代码示例:

[DataContract]//必须申明,否则无法序列化

public class Person

{

[DataMember(Name = "姓名")]//必须申明,否则无法序列化

private string Name;

[DataMember(Name = "性别")]//必须申明,否则无法序列化

private bool Sex;

public Person(string name, bool sex)

{

this.Name = name;

this.Sex = sex;

}

public override string ToString()

{

return "姓名:" + this.Name + "\t性别:" + (this.Sex ? "男" : "女");

}

}

[DataContract]

public class Programmer : Person

{

[DataMember(Name = "编程语言")]

private List<string> Languages;

public Programmer(string name, bool sex, List<string> languages)

: base(name, sex)

{

this.Languages = languages;

}

public override string ToString()

{

StringBuilder str = new StringBuilder();

str.Append(base.ToString() + "\t编程语言:");

foreach (string l in this.Languages)

{

str.Append(l + " ");

}

return str.ToString();

}

}

class Program

{

static void Main(string[] args)

{

string filePath = @"D:\users\lizw\桌面\ObjectJson.txt";

List<string> languages = null;

List<Programmer> list = new List<Programmer>();

languages = new List<string>(new string[] { "C#", "Java" });

list.Add(new Programmer("李志伟", true, languages));

languages = new List<string>(new string[] { "C#", "C++" });

list.Add(new Programmer("Coder2", false, languages));

languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

list.Add(new Programmer("Coder3", true, languages));

//序列化对象

DataContractJsonSerializer ser =

new DataContractJsonSerializer(typeof(List<Programmer>));

MemoryStream ms = new MemoryStream();

ser.WriteObject(ms, list);//将对象转换成json存储

string jsonStr = Encoding.UTF8.GetString(ms.ToArray());

File.WriteAllText(filePath, jsonStr);

//反序列化对象

list.Clear();

ms.Position = 0;

list = (List<Programmer>)ser.ReadObject(ms);

foreach (Programmer p in list)

{

Console.WriteLine(p);

}

ms.Dispose();//关闭内存流

Console.WriteLine("OK!");

Console.Read();

}

}

得到的Json文本:

[{"姓名":"李志伟","性别":true,"编程语言":["C#","Java"]},

{"姓名":"Coder2","性别":false,"编程语言":["C#","C++"]},

{"姓名":"Coder3","性别":true,"编程语言":["C#","C++","C","Java"]}]

注意:此种方式Json序列化对象时,可以序列化对象的任意成员(包括私有成员),但是使用此方式必须要在类和成员的定义处加上相应的特性(具体请参考代码)。

(4)小结

使用的DLL

序列化范围

项目范围

依赖构造器

依赖特性

Newtonsoft.Json.dll

公有成员

任意项目

System.Web.Extensions.dll

公有成员

Web项目

无参构造器

System.Runtime.Serialization.dll

所有成员

任意项目

3.解析JSON字符串(使用Newtonsoft.Json.dll)

(1)使用JsonTextReader类进行只进读取(不常用)

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"

[{'Languages':['C#','Java'],'Name':'李志伟','Sex':true},

{'Languages':['C#','C++'],'Name':'Coder2','Sex':false},

{'Languages':['C#','C++','C','Java'],'Name':'Coder3','Sex':true}]";

JsonTextReader json = new JsonTextReader(new StringReader(jsonStr));

while (json.Read())

{

Console.WriteLine(json.Value + "--" + json.TokenType + "--" + json.ValueType);

}

Console.WriteLine("OK!");

Console.Read();

}

}

(2)使用JArray、JObject、JToken进行读取(常用)

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"

[{'Languages':['C#','Java'],'Name':'李志伟','Sex':true},

{'Languages':['C#','C++'],'Name':'Coder2','Sex':false},

{'Languages':['C#','C++','C','Java'],'Name':'Coder3','Sex':true}]";

JArray ja = (JArray)JsonConvert.DeserializeObject(jsonStr);

foreach (JToken jt in ja)

{

JObject jo = (JObject)jt;

JArray temp = (JArray)jo["Languages"];

foreach (JToken token in temp)

{

Console.Write(token+" ");

}

Console.WriteLine("\t" + jo["Name"] + "\t" + jo["Sex"]);

}

Console.WriteLine("OK!");

Console.Read();

}

}

(3)Json时间字符串的处理

class Program

{

static void Main(string[] args)

{

DateTime time = DateTime.Now;

//这里使用自定义日期格式

IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();

timeConverter.DateTimeFormat = "北京时间:yyyy-MM-dd HH:mm:ss";

//序列化时间

string JsonStr = JsonConvert.SerializeObject(time, timeConverter);

Console.WriteLine(JsonStr);

//反序列化时间

DateTime time2 = JsonConvert.DeserializeObject<DateTime>(JsonStr, timeConverter);

Console.WriteLine(time2);

Console.WriteLine("OK!");

Console.Read();

}

}

4.读取Json字符串的技巧

(1)使用匿名类

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"{'Languages':['C#','Java'],'Name':'李志伟','Sex':true}";

//创建匿名类

var TempClass = new { Languages = new string[0], Name = string.Empty, Sex = false };

//反序列化

var O = JsonConvert.DeserializeAnonymousType(jsonStr, TempClass);

Console.WriteLine(O.Name+"\t"+O.Sex+"\t"+O.Languages[1]);

Console.Read();

}

}

(2)使用索引器

class Program

{

static void Main(string[] args)

{

//Json字符串

string jsonStr = @"{'Languages':['C#','Java'],'Name':'李志伟','Sex':true}";

//反序列化

JObject O = JsonConvert.DeserializeObject(jsonStr) as JObject;

//使用索引器访问

Console.WriteLine(O["Name"] + "\t" + O["Sex"] + "\t" + O["Languages"][1]);

Console.Read();

}

}

C#操作Json(转)的更多相关文章

  1. 让C#可以像Javascript一样操作Json

    Json的简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了 ...

  2. JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  3. C# 技巧(3) C# 操作 JSON

    RestAPI中, 经常需要操作json字符串,  需要把json字符串"反序列化"成一个对象, 也需要把一个对象"序列化"成一字符串. C# 操作json, ...

  4. JS操作JSON总结

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  5. jsoncpp操作 json

    jsoncpp操作 json 博客分类: c/c++ object-c 之 iphone   #include <iostream> //#include "json/json. ...

  6. C#操作JSON

    http://www.cnblogs.com/LiZhiW/p/3624729.html C#操作JSON 1. .NET对JSON的支持介绍............................. ...

  7. JSON和GSON操作json数据

    1,JSON操作json import net.sf.json.JSONArray; import net.sf.json.JSONObject; //json操作数据 public static S ...

  8. js之操作JSON数据

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  9. (转)JSON数据格式和js操作json总结

    原:http://niutuku.com/tech/javaScript/273643.shtml JSON数据格式和js操作json总结 来源:niutuku.com |         vince ...

  10. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

随机推荐

  1. 你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?

    你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对? 你想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?如果计算 ...

  2. 通过SQL Server 2008 访问MySQL(转)

    在公司中经常会遇到部署多种数据库环境的情况,对于开发人员来说经常在不同数据库之间转换确实有些繁琐,本篇将介绍从SQL Server 操作MySQL 数据库的方法. 数据库测试环境 1. SQL Ser ...

  3. C/C++ 框架,类库,资源集合

    很棒的 C/C++ 框架,类库,资源集合. Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchrono ...

  4. C++11新特性:Lambda函数(匿名函数)

    声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 ...

  5. POJ 3792 Area of Polycubes(思维)

    点我看题目 题意 : 其实我也说不太清楚题意,就是给你很多方块,每放一块方块,都要和前一块有一个面相接,如果不相接,就输出NO,并输出是第几个方块不相接的.如果满足每一个都和前边相接,那就判断所有没有 ...

  6. saltstack远程操作WINDOWS的POWERSHELL脚本

    这个东东,花了两天来查找资料和测试,终于算是搞定.作记录: 直接在MASTER上执行的命令: salt '*' cmd.script salt://scripts/windows_task.ps1 a ...

  7. jquery.dataTables插件使用例子详解

    DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HTML表格 效果图 代码 <!doctype html> & ...

  8. HeadFirst设计模式之RMI介绍

    一.使用步骤 1.generate stubs and skeletons:Run rmic on the remote implementation class 如:D:\Workspaces\My ...

  9. 96. Unique Binary Search Trees

    题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...

  10. 关于hadoop的环境变量

    export PATH export JAVA_HOME=/opt/jdk1.7 export PATH=$PATH:$JAVA_HOME/bin 为什么/etc/profile 添加了环境变量had ...