對 JSON 數據進行序列化和反序列化


如何:對 JSON 數據進行序列化和反序列化

JSON(JavaScript 對象符號)是一種高效的數據編碼格式,可用於在客戶端瀏覽器和支持 AJAX 的 Web 服務之間快速交換少量數據。

本主題演示如何使用 DataContractJsonSerializer 將 .NET 類型對象序列化為 JSON 編碼數據,然后將 JSON 格式的數據反序列化回 .NET 類型的實例。 本示例使用數據協定來演示用戶定義的 Person 類型的序列化和反序列化。

通常,當在通過支持 AJAX 的終結點公開的服務操作中使用數據協定類型時,Windows Communication Foundation (WCF) 會自動處理 JSON 序列化和反序列化。 但是,在某些情況下您可能需要直接處理 JSON 數據,這正是本主題演示的方案。

備注

如果在服務器上序列化傳出答復期間出現錯誤,或者答復操作由於某個其他原因引發異常,則可能不會將其作為錯誤返回到客戶端。

本主題基於JSON 序列化示例。

定義 Person 的數據協定

  1. 通過將 Person 附加到類並將 DataContractAttribute 特性附加到要序列化的成員,為 DataMemberAttribute 定義數據協定。 有關數據協定的詳細信息,請參閱設計服務協定

    C#
    [DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; } 

將 Person 類型的實例序列化為 JSON

  1. 創建 Person 類型的實例。

    C#
    Person p = new Person(); p.name = "John"; p.age = 42; 
  2. 使用 Person 將 DataContractJsonSerializer 對象序列化為內存流。

    C#
    MemoryStream stream1 = new MemoryStream(); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person)); 
  3. 使用 WriteObject 方法將 JSON 數據寫入到流中。

    C#
    ser.WriteObject(stream1, p);  
    
  4. 顯示 JSON 輸出。

    C#
    stream1.Position = 0; StreamReader sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd()); 

從 JSON 反序列化 Person 類型的實例

  1. 通過使用 Person 的 ReadObject 方法,將 JSON 編碼數據反序列化為一個新的 DataContractJsonSerializer 實例。

    C#
    stream1.Position = 0; Person p2 = (Person)ser.ReadObject(stream1); 
  2. 顯示結果。

    C#
    Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}"); 

示例

C#
// 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 序列化程序將引發一個序列化異常,如以下示例代碼中所示。

C#
[DataContract] public class TestDuplicateDataBase { [DataMember] public int field1 = 123; } [DataContract] public class TestDuplicateDataDerived : TestDuplicateDataBase { [DataMember] public new int field1 = 999; } 

請參閱

獨立 JSON 序列化
支持 JSON 和其他數據傳輸格式

反饋

我們衷心期待你的反饋意見。 請選擇要提供的反饋類型:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM