JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。 (具体参见http://www.json.org/json-zh.html)
json格式的数据示例:
"{\"Name\":\"Apple\",\"Expiry\":\"2010-12-18T00:00:00\",\"Price\":3.99,\"Sizes\":[\"Small\",\"Medium\",\"Large\"]}"
利用.Net 3.5自带的JavaScriptSerializer进行JSON序列化与反序列化
为了使用.Net 3.5自带的JavaScriptSerializer,需要添加引用System.ServiceModel.Web和System.Runtime.Serialization
using System.Web.Script.Serialization;
using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
1.引入System.Web.Script.Serialization命名空间使用JavaScriptSerializer类实现简单的序列化
//定义一个需要序列化的类:
public class Employee
{
[ScriptIgnore]
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}//注:ScriptIgnore特性用来标记不需要被序列化的属性
测试:
Employee emp = new Employee()
{
Id = 1,
Name = "ZhangSan",
Age = 20
};
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//Serializer
string serializerEmp = jsonSerializer.Serialize(emp);
Response.Write(serializerEmp + "<br/>");//输出:{"Name":"ZhangSan","Age":20}
//DeSerializer
Employee p = jsonSerializer.Deserialize<Employee>(serializerEmp);
Response.Write("id:"+p.Id.ToString() + ",Name:" + p.Name +",Age:"+ p.Age + "<br/>");//输出 id:0,Name:ZhangSan,Age:20
2.引入 System.Runtime.Serialization.Json命名空间,使用DataContractJsonSerializer类实现序列化
[DataContract]
public class People
{
[DataMember(Name = "id")]
public int Id { get; set; }
[IgnoreDataMember]
public string Name { get; set; }
}//注:可以使用IgnoreDataMember指定成员不被序列化,DataMember定义序列化属性参数。如果使用DataMember标记属性字段必须使用DataContract标记类,否则DataMember标记将不起作用
测试:
People people = new People() { Id = 2, Name = "LiSi" };
DataContractJsonSerializer json = new DataContractJsonSerializer(people.GetType());
string serializedPeople = "";
//Serializer序列化
using (MemoryStream ms = new MemoryStream())
{
json.WriteObject(ms, people);
serializedPeople = Encoding.UTF8.GetString(ms.ToArray());
Response.Write(serializedPeople + "<br/>");//输出:{"id":2}
}
//DeSerializer反序列化
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(serializedPeople)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(People));
People myPepole = serializer.ReadObject(ms) as People;
Response.Write("Id:"+myPepole.Id.ToString() + ",Name:" + myPepole.Name + "<br/>");//输出: Id:2,Name:
}