C#操作Json(转)
原文: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(转)的更多相关文章
- 让C#可以像Javascript一样操作Json
Json的简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了 ...
- JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- C# 技巧(3) C# 操作 JSON
RestAPI中, 经常需要操作json字符串, 需要把json字符串"反序列化"成一个对象, 也需要把一个对象"序列化"成一字符串. C# 操作json, ...
- JS操作JSON总结
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- jsoncpp操作 json
jsoncpp操作 json 博客分类: c/c++ object-c 之 iphone #include <iostream> //#include "json/json. ...
- C#操作JSON
http://www.cnblogs.com/LiZhiW/p/3624729.html C#操作JSON 1. .NET对JSON的支持介绍............................. ...
- JSON和GSON操作json数据
1,JSON操作json import net.sf.json.JSONArray; import net.sf.json.JSONObject; //json操作数据 public static S ...
- js之操作JSON数据
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- (转)JSON数据格式和js操作json总结
原:http://niutuku.com/tech/javaScript/273643.shtml JSON数据格式和js操作json总结 来源:niutuku.com | vince ...
- js中如何操作json数据
一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...
随机推荐
- GIS的数学基础
在这里需要说明一点,任何领域的概念.技术都有其特定的适用范围,有其解决的问题,有其发展的历史,所以,抛开应用环境.范围来谈技术就像是没有根系的枝丫,枝丫再粗壮也只是一根木头而已. 那接下来我们来聊聊什 ...
- 读书笔记 (二) ———Fundamentals of Multiagent Systems with NetLogo Examples by Prof. Jose M Vidal
chapter 2 分布式约束1 分布式约束满足 1.1 过滤算法 1.2 基于归结的调和算法 consistency 1.3 异步回溯 1.4 异步弱承诺? 1.5 分布式突破?2 分布式受限优化 ...
- 1049: [HAOI2006]数字序列 - BZOJ
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大.Input 第一行包含一个数n ...
- c++ 链接
header.h #ifndef HEADER_H #define HEADER_H unsigned long getFac(unsigned short num); ; #endif // HEA ...
- hdu 3646
DP 状态转移方程还是比较容易想到 关键问题是当前要攻击的怪兽的血量 dp[i][j] = max(dp[i-1][j]+第i只鸟不使用double可杀死的怪兽数, dp[i-1][j-1]+第i ...
- HDU1437+模拟
枚举中间可能出现的天气 #include<stdio.h> #include<string.h> #include<stdlib.h> ; ][ ]; void s ...
- [杂题]FZU2190 非提的救赎
中文题,题意不多说. 本来感觉很像dp 其实只要从上到下维护单调性就好了 坑是......这个oj......用cin很容易TLE...... //#include <bits/stdc++.h ...
- cocos2d-x 常规库的图文件配置
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE := cocos_lua_static LOCAL_MODULE_FILE ...
- module_init宏解析 linux驱动的入口函数module_init的加载和释放
linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...
- web客户端通过ajaxfileupload方式上传文件
fileUpload.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...