• 对 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 和其他数据传输格式

    反馈

    我们衷心期待你的反馈意见。 请选择要提供的反馈类型:

  • 相关阅读:
    ERP渠道管理添加验证和查询(二十二)
    SqlServer导入Excel数据
    WebApi帮助类
    SqlServer 递归查询树
    SqlServer查看表、存储过程、耗时查询、当前进程、开销较大的语句
    Excel上传找到错误数据类型
    索引Hint提示(INDEX Hint)
    SqlServer批量Sql一个表的数据导入到另一个数据
    SqlServer 游标
    JAVA运算符
  • 原文地址:https://www.cnblogs.com/hbtmwangjin/p/9143618.html
Copyright © 2020-2023  润新知