C# 序列化/反序列化 json
2014-08-26 16:02
417 查看
1. Json 设计思想与数据格式
这边文章给人眼前一亮的感觉,读完之后顿时感觉原来设计可以如此简单漂亮。它引述的观点诠释了json背后的设计思想:
从结构上看,所有的数据最终可以解析成三种类型:
①标量:构成数据的基石,无法进行进一步的切割。如字符串,数字等。
②序列:若干相关数据按一定次序组合在一起。
③映射:键值对。
Json BNF:
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的入门文档,介绍了服务器端的处理。
4.
这里有个解析足球赛事分类的例子。
引用:
Json官方格式文档 http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
RFC 4627 http://tools.ietf.org/html/rfc4627
这边文章给人眼前一亮的感觉,读完之后顿时感觉原来设计可以如此简单漂亮。它引述的观点诠释了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
相关文章推荐
- C#使用DataContractJsonSerializer实现Json格式的序列化和反序列化
- c# 读取json 写json 序列化与反序列化 .net 4.0
- [asp.net]C#实现json的序列化和反序列化
- [asp.net]C#实现json的序列化和反序列化
- C# 使用JSON对数据序列化和反序列化.
- C#中的Json的序列化和反序列化
- [asp.net]C#实现json的序列化和反序列化
- [asp.net]C#实现json的序列化和反序列化
- C#中JSON序列化和反序列化
- c#中的Json的序列化和反序列化
- C# Json 序列化和反序列化 工具类 Newtonsoft.Json.dll
- C# 使用JSON对数据序列化和反序列化.
- C# .NET利用Newtonsoft.Json来序列化和反序列化对象
- c#.net将对象序列化,反序列化json
- C#中的Json的序列化和反序列化
- C#通用Json格式序列化和反序列化的方法
- ASP.NET C#使用JavaScriptSerializer实现序列化与反序列化得到JSON
- C#实现json的序列化和反序列化
- C# 二进制、Xml、Json序列化和反序列化
- c# 使用 Newtonsoft.Json 序列化json字符串以及,反序列化对象