JSON(JavaScript 對象符號)是一種高效的數據編碼格式,可用於在客戶端瀏覽器和支持 AJAX 的 Web 服務之間快速交換少許數據。html
本主題演示如何使用 DataContractJsonSerializer 將 .NET 類型對象序列化爲 JSON 編碼數據,而後將 JSON 格式的數據反序列化回 .NET 類型的實例。 本示例使用數據協定來演示用戶定義的 Person
類型的序列化和反序列化。git
一般,當在經過支持 AJAX 的終結點公開的服務操做中使用數據協定類型時,Windows Communication Foundation (WCF) 會自動處理 JSON 序列化和反序列化。 可是,在某些狀況下您可能須要直接處理 JSON 數據,這正是本主題演示的方案。github
備註json
若是在服務器上序列化傳出答覆期間出現錯誤,或者答覆操做因爲某個其餘緣由引起異常,則可能不會將其做爲錯誤返回到客戶端。api
本主題基於JSON 序列化示例。瀏覽器
經過將 Person
附加到類並將 DataContractAttribute 特性附加到要序列化的成員,爲 DataMemberAttribute 定義數據協定。 有關數據協定的詳細信息,請參閱設計服務協定。服務器
[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
建立 Person
類型的實例。編碼
Person p = new Person(); p.name = "John"; p.age = 42;
使用 Person
將 DataContractJsonSerializer 對象序列化爲內存流。spa
MemoryStream stream1 = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
使用 WriteObject 方法將 JSON 數據寫入到流中。設計
ser.WriteObject(stream1, p);
顯示 JSON 輸出。
stream1.Position = 0; StreamReader sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
經過使用 Person
的 ReadObject 方法,將 JSON 編碼數據反序列化爲一個新的 DataContractJsonSerializer 實例。
stream1.Position = 0; Person p2 = (Person)ser.ReadObject(stream1);
顯示結果。
Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");
// Create a User object and serialize it to a JSON stream. public static string WriteFromObject() { //Create User object. User user = new User("Bob", 42); //Create a stream to serialize the object to. MemoryStream ms = new MemoryStream(); // Serializer the User object to the stream. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User)); ser.WriteObject(ms, user); byte[] json = ms.ToArray(); ms.Close(); return Encoding.UTF8.GetString(json, 0, json.Length); } // Deserialize a JSON stream to a User object. public static User ReadToObject(string json) { User deserializedUser = new User(); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)); DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedUser.GetType()); deserializedUser = ser.ReadObject(ms) as User; ms.Close(); return deserializedUser; }
備註
對於包含多個具備相同名稱的成員的數據協定,JSON 序列化程序將引起一個序列化異常,如如下示例代碼中所示。
[DataContract] public class TestDuplicateDataBase { [DataMember] public int field1 = 123; } [DataContract] public class TestDuplicateDataDerived : TestDuplicateDataBase { [DataMember] public new int field1 = 999; }
咱們衷心期待你的反饋意見。 請選擇要提供的反饋類型: