如何:對 JSON 數據進行序列化和反序列化
JSON(JavaScript 對象符號)是一種高效的數據編碼格式,可用於在客戶端瀏覽器和支持 AJAX 的 Web 服務之間快速交換少量數據。
本主題演示如何使用 DataContractJsonSerializer 將 .NET 類型對象序列化為 JSON 編碼數據,然后將 JSON 格式的數據反序列化回 .NET 類型的實例。 本示例使用數據協定來演示用戶定義的 Person
類型的序列化和反序列化。
通常,當在通過支持 AJAX 的終結點公開的服務操作中使用數據協定類型時,Windows Communication Foundation (WCF) 會自動處理 JSON 序列化和反序列化。 但是,在某些情況下您可能需要直接處理 JSON 數據,這正是本主題演示的方案。
備注
如果在服務器上序列化傳出答復期間出現錯誤,或者答復操作由於某個其他原因引發異常,則可能不會將其作為錯誤返回到客戶端。
本主題基於JSON 序列化示例。
定義 Person 的數據協定
-
通過將
Person
附加到類並將 DataContractAttribute 特性附加到要序列化的成員,為 DataMemberAttribute 定義數據協定。 有關數據協定的詳細信息,請參閱設計服務協定。C#[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
將 Person 類型的實例序列化為 JSON
-
創建
Person
類型的實例。C#Person p = new Person(); p.name = "John"; p.age = 42;
-
使用
Person
將 DataContractJsonSerializer 對象序列化為內存流。C#MemoryStream stream1 = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
-
使用 WriteObject 方法將 JSON 數據寫入到流中。
C#ser.WriteObject(stream1, p);
-
顯示 JSON 輸出。
C#stream1.Position = 0; StreamReader sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
從 JSON 反序列化 Person 類型的實例
-
通過使用
Person
的 ReadObject 方法,將 JSON 編碼數據反序列化為一個新的 DataContractJsonSerializer 實例。C#stream1.Position = 0; Person p2 = (Person)ser.ReadObject(stream1);
-
顯示結果。
C#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; }
請參閱
反饋
我們衷心期待你的反饋意見。 請選擇要提供的反饋類型: