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

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

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

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

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

備註json

若是在服務器上序列化傳出答覆期間出現錯誤,或者答覆操做因爲某個其餘緣由引起異常,則可能不會將其做爲錯誤返回到客戶端。api

本主題基於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 對象序列化爲內存流。spa

    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 和其餘數據傳輸格式

反饋

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

相關文章
相關標籤/搜索