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

  • 2017/03/30
  • 作者

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

反馈

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

产品反馈

 登录以提供文档反馈

 
本文档当前无任何反馈。

最新文章

  1. 解决Bash On Ubuntu On Window安装Zsh无效问题附安装说明
  2. iOS多线程之9.自定义NSOperation
  3. AJAX请求时status返回状态明细表 readyState的五种状态
  4. 使用MyEclipse中servlet对SQL Server 2008的CRUD
  5. web前端打印总结
  6. nginx支持cgi(c,c++)
  7. Docker学习总结之docker介绍
  8. js中关于prototype学习(2015年1月5号晚)
  9. 微价值:专訪《甜心爱消除》个人开发人员Lee,日入千元!
  10. php两个问号??表示什么意思,PHP两个问号运算符,双问号表达式
  11. 浅谈对SpringMVC的认识
  12. ServletContainerInitializer初始化器
  13. 消息队列比较-rabbitmq/kafka/rocketmq/ONS
  14. Python编写守护进程程序
  15. Lua中的元表与元方法
  16. topcoder srm 610 div1
  17. 正则校验:微信号,qq号,邮箱
  18. linux 学习笔记 APACHE安装总结
  19. 网口扫盲二:Mac与Phy组成原理的简单分析(转)
  20. 语义slam用于高精地图和高精定位的一些想法

热门文章

  1. FPGA——流水灯(一)
  2. [转]再识Cortex-M3之堆栈
  3. Mac+sublime text+skim
  4. VB6 二维数组去重实现
  5. 创建第一个vue实例
  6. shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
  7. Epson 微型打印机打印 LOGO C#
  8. Game Engine Architecture 4
  9. C#使用File.Create()创建文件后资源被占用
  10. React中this.props的主要属性