原文链接:http://www.cnblogs.com/fengxuehuanlin/p/5700282.html
一.什么是Json:
中午肚子饿了,到餐厅点餐。向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了。用户拿到盛放食物的碗,就可以获得点的餐了。这个碗就充当了数据交换的容器了(^-^)
客户端向服务器端发送请求后,服务器端怎么才能把用户需要的数据返回给客户端呢。这时我们就需要用一个指定的格式将数据,按照指定格式返回客户端。这时就有了两种数据传输的方式(XML和Json):
在普通的Web应用中,不管是服务器端还是客户端解析XML代码会非常麻烦,所以这时Json就更加满足数据传输解析的要求。采用Json格式的方式进行数据的传输,不仅方便传输解析,还特别易于人阅读和编写。
二.XML与Json转换:
1.常规转换:
<emp>
<name>fxhl</name>
<city>深圳</city>
<age>23</age>
</emp>
转换为Json为:
{"name":"fxhl","city":"深圳","age":23}
三.Json的表现形式:
1.对象:
{
"returnCode": "R0000",
"returnMsg": "成功",
"lessTimes": "2",
"domainLink": "",
"seqNum": "1",
"identification": "595279",
"isNeedImageCode": "false"
}
2.数组:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
3.数组对象混合:
这是截取的一小部分,对于比较复杂的Json格式的字符串,可以在线验证json。格式化一个格式。方便观看
Json的表现形式一般就三种(对象,数组,字符串),使用过程中,只是将对象与数组进行混合了
{
"icon": [
{
"title": "尚天猫,就购了",
"icon_category": "baobei",
"icon_key": "icon-service-tianmao",
"trace": "srpservice",
"innerText": "天猫宝贝",
"url": "//www.tmall.com/"
},
{
"title": "保险理赔",
"position": "99",
"innerText": "分组-保险理赔",
"iconPopupComplex":
{
"popup_title": "保险理赔",
"subIcons": [
{
"dom_class": "icon-service-yunfeixian",
"icon_content": "卖家赠送退货运费险"
}
]
}
}
]
}
四.Json序列化和反序列化的三种方式
1.使用JavaScriptSerializer类:
//使用JavaScriptSerializer方式需要引入的命名空间,这个在程序集System.Web.Extensions.dll.中
using System.Web.Script.Serialization;
class Program
{
static void Main(string[] args)
{
//序列化操作
JavaScriptSerializer jss = new JavaScriptSerializer();
var json = new { name = "fxhl", age = 23 };
string str = jss.Serialize(json);
//反序列化操作
Person person = jss.Deserialize<Person>(str);
Console.WriteLine(person.name);
}
}
[Serializable]
public class Person
{
public string name { get; set; }
public int age { get; set; }
}
2.使用DataContractJsonSerializer类:
//Person实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的
//使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
using System.Runtime.Serialization.Json;
static void Main(string[] args)
{
//序列化操作
Person p1 = new Person()
{
name = "fxhl",
age = 23
};
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
MemoryStream msObj = new MemoryStream();
//将序列化之后的Json格式数据写入流中
js.WriteObject(msObj, p1);
//从0这个位置开始读取流中的数据
msObj.Position = 0;
StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
string json = sr.ReadToEnd();
Console.WriteLine(json);
sr.Close();
msObj.Close();
//反序列化操作
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Person));
Person model = (Person)deseralizer.ReadObject(ms);// //反序列化ReadObject
Console.WriteLine(model.name);
}
Console.ReadKey();
}
}
[DataContract]
public class Person
{
[DataMember]
public string name { get; set; }
[DataMember]
public int age { get; set; }
}
3.使用JSON.NET类库:
引入类库:
//使用Json.NET类库需要引入的命名空间
class Program
{
static void Main(string[] args)
{
//序列化操作
var json = new { user = new { name = "fxhl", age = 23 }};
string jsonData = JsonConvert.SerializeObject(json);
Console.WriteLine(jsonData);
//反序列化操作方法一
Person p1= JsonConvert.DeserializeObject<Person>(jsonData);
Console.WriteLine(p1.user.name);
//反序列化操作方法二
string json2 = "[{\"user\":{\"name\":\"fxhl\",\"age\":23}}]";
List<Person> listp2= JsonConvert.DeserializeObject<List<Person>>(json2);
Console.WriteLine(listp2[0].user.name);
Console.ReadKey();
}
}
public class Person
{
public Person user { get; set; }
public string name { get; set; }
public int age { get; set; }
}
总结:最后还是尽量使用JSON.NET来序列化和反序列化,性能好。
本文介绍了JSON的基本概念,包括其与XML的区别、常见的表现形式及序列化与反序列化的实现方法。

被折叠的 条评论
为什么被折叠?



