json数据的序列化和反序列化

来源:互联网 发布:mac配置jenkins 编辑:程序博客网 时间:2024/05/18 01:58
来自:https://msdn.microsoft.com/zh-cn/library/bb412179.aspx

如何:对 JSON 数据进行序列化和反序列化

.NET Framework (current version)
其他版本
 

发布日期: 2016年5月

JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间快速交换少量数据。

本主题演示如何将.NET 类型对象序列化为 JSON 编码数据,然后以 JSON 格式的数据反序列化回.NET 类型使用的实例DataContractJsonSerializer。 本示例使用数据协定来演示用户定义的 Person 类型的序列化和反序列化。

通常,当在通过支持 AJAX 的终结点公开的服务操作中使用数据协定类型时,Windows Communication Foundation (WCF) 会自动处理 JSON 序列化和反序列化。 但是,在某些情况下您可能需要直接处理 JSON 数据,这正是本主题演示的方案。

System_CAPS_ICON_note.jpg 说明

如果在服务器上序列化传出答复期间出现错误,或者答复操作由于某个其他原因引发异常,则可能不会将其作为错误返回到客户端。

本主题基于JSON 序列化示例。

定义 Person 的数据协定

  1. 定义的数据约定Person通过附加DataContractAttribute到类和DataMemberAttribute属性要序列化的成员。 有关以下内容的详细信息数据协定,请参见设计服务协定。

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

将 Person 类型的实例序列化为 JSON

  1. 创建 Person 类型的实例。

    Person p = new Person();  p.name = "John";  p.age = 42;  
  2. 序列化Person对象传递给内存流使用DataContractJsonSerializer。

    MemoryStream stream1 = new MemoryStream();  DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));  
  3. 使用WriteObject方法将 JSON 数据写入到流。

    ser.WriteObject(stream1, p);  
  4. 显示 JSON 输出。

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

从 JSON 反序列化 Person 类型的实例

  1. 将 JSON 编码数据反序列化为的新实例Person使用ReadObject方法DataContractJsonSerializer。

    stream1.Position = 0;  Person p2 = (Person)ser.ReadObject(stream1);  
  2. 显示结果。

    Console.Write("Deserialized back, got name=");  Console.Write(p2.name);  Console.Write(", age=");  Console.WriteLine(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;  }    
System_CAPS_ICON_note.jpg 说明

对于包含多个具有相同名称的成员的数据协定,JSON 序列化程序将引发一个序列化异常,如以下示例代码中所示。

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

原创粉丝点击