您的位置:首页 > Web前端 > JavaScript

C# 序列化/反序列化 json

2014-08-26 16:02 417 查看
1. Json 设计思想与数据格式

这边文章给人眼前一亮的感觉,读完之后顿时感觉原来设计可以如此简单漂亮。它引述的观点诠释了json背后的设计思想:

从结构上看,所有的数据最终可以解析成三种类型:

①标量:构成数据的基石,无法进行进一步的切割。如字符串,数字等。

②序列:若干相关数据按一定次序组合在一起。

③映射:键值对。

Json BNF:

object = "{" "}" | "{" members "}"
members = pair | pair "," members
pair = string ":" value
array = "[" "]" | "[" elements "]"
elements = value | value "," elements
value = string | number | object | array | "true" | "false" | "null"


string = 2 <">| <"> chars <">
chars = char | char chars
char = any-Unicode-character-except-"-or-\-or-control-character | "\<">" | "\\" | "\/" | "\b" | "\f" | "\n" | "\r" | "\t" | "\u" four-hex-digits
number = int | int frac | int exp | int frac exp
int = digit | digit1-9 digits | "-" digit | "-" digit1-9 digits
frac = "." digits
exp = e digits
digits = digit | digit digits
e = "e" | "e+" | "e-" | "E" | "E+" | "E-"
对比json的设计与实现,标量、序列、映射分别为value、array、object。

2. 数据契约(data contracts)

这里是微软的官方文档。

数据契约是服务端和客户端对所交换的数据格式达成的一个协议。话句话说就是,它们对交换数据的每一个byte的意义达成了共识。用这种方法可以在服务器和客户端间进行对象的传递。WCF(Windows Communication Foundation) 程序使用独立的数据契约引擎序列化/解析需要交换的对象数据,对于用户自定义的对象类型,提供了DataContract、DataMember 、IgnoreDataMember的属性标识帮助引擎进行序列化和解析。

a. [DataContract ( Name="xx", Namespace="xx" ) ]

该标识在类声明的前面定义,用来表示该类符合该数据契约,可以被序列化。Name 是该数据契约的名称。Namespace 是该数据契约的名称空间,通常它是 URI 的形式,这两个属性都有相应的缺省值。

b. [DataMember ( Name="xx", Order=n, IsRequired=true ) ]

该标识在类的域和属性前定义,用来表示该域或属性需要序列化。Name 表示该属性的名称,缺省为属性本身的名称。Order 定义该属性在序列化后的字符串中的位置,具体排序规则为:①父类属性优先。②无Order 属性的域或属性按字母表的顺序排序。③有 Order 属性,按先 Order 值,再字母表的顺序排。IsRequired 属性表示该域或属性必须存在,否则抛出异常。

c. [IgnoreDataMember]

该标识和DataMember类似,用来禁止该域或属性被序列化。

d. 服务端和客户端如果同时满足数据契约,则它们的数据可以交换。满足数据契约是指同时满足如下条件:

DataContract 的 Namespace + Name 相同

DataMember 的 Name 相同

序列化后属性或域的顺序相同

e. 继承DataContract 被处理成包含父类所有 DataMember 的整体。

3. C#对Json的支持

这里有一边博客简单的介绍了C#对json的处理。

这里是微软的官方文档。

这里是IBM介绍Json的入门文档,介绍了服务器端的处理。

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

/// <summary>
/// Define data contract for Persion
/// </summary>
[DataContract]
internal class Person
{
[DataMember]
internal string name;
[DataMember]
internal int age;
public override string ToString()
{
return "name:" + name + " age:" + age + "\n";
}
}

static void Main(string[] args)
{
// Create an instance of the Person type
Person p = new Person();
p.name = "John";
p.age = 42;

// Serialize the Person object to a memory stream
MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
ser.WriteObject(stream1, p);

// Output serialized json
stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
string dataString = sr.ReadToEnd();
Console.WriteLine("JSON form of Person object: {0}", dataString);

// Deserialize
MemoryStream stream2 = new MemoryStream(Encoding.Default.GetBytes(dataString));
stream2.Position = 0;
Person p2 = (Person)ser.ReadObject(stream2);
Console.Write("Deserialized back: " + p2.ToString());
}


4.
这里有个解析足球赛事分类的例子。

引用:

Json官方格式文档  http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 

RFC 4627 http://tools.ietf.org/html/rfc4627
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json c#