对 JSON 数据进行序列化和反序列化
如何:对 JSON 数据进行序列化和反序列化
- 2017/03/30
- 作者
JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间快速交换少量数据。
本主题演示如何使用 DataContractJsonSerializer 将 .NET 类型对象序列化为 JSON 编码数据,然后将 JSON 格式的数据反序列化回 .NET 类型的实例。 本示例使用数据协定来演示用户定义的 Person
类型的序列化和反序列化。
通常,当在通过支持 AJAX 的终结点公开的服务操作中使用数据协定类型时,Windows Communication Foundation (WCF) 会自动处理 JSON 序列化和反序列化。 但是,在某些情况下您可能需要直接处理 JSON 数据,这正是本主题演示的方案。
备注
如果在服务器上序列化传出答复期间出现错误,或者答复操作由于某个其他原因引发异常,则可能不会将其作为错误返回到客户端。
本主题基于JSON 序列化示例。
定义 Person 的数据协定
通过将
Person
附加到类并将 DataContractAttribute 特性附加到要序列化的成员,为 DataMemberAttribute 定义数据协定。 有关数据协定的详细信息,请参阅设计服务协定。C#复制[DataContract]
internal class Person
{
[DataMember]
internal string name; [DataMember]
internal int age;
}
将 Person 类型的实例序列化为 JSON
创建
Person
类型的实例。C#复制Person p = new Person();
p.name = "John";
p.age = 42;
使用
Person
将 DataContractJsonSerializer 对象序列化为内存流。C#复制MemoryStream stream1 = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
使用 WriteObject 方法将 JSON 数据写入到流中。
C#复制ser.WriteObject(stream1, p);
显示 JSON 输出。
C#复制stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
Console.Write("JSON form of Person object: ");
Console.WriteLine(sr.ReadToEnd());
从 JSON 反序列化 Person 类型的实例
通过使用
Person
的 ReadObject 方法,将 JSON 编码数据反序列化为一个新的 DataContractJsonSerializer 实例。C#复制stream1.Position = 0;
Person p2 = (Person)ser.ReadObject(stream1);
显示结果。
C#复制Console.WriteLine($"Deserialized back, got name={p2.name}, age={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;
}
备注
对于包含多个具有相同名称的成员的数据协定,JSON 序列化程序将引发一个序列化异常,如以下示例代码中所示。
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}
请参阅
反馈
我们衷心期待你的反馈意见。 请选择要提供的反馈类型:
对 JSON 数据进行序列化和反序列化的更多相关文章
- Json数据的序列化与反序列化的三种经常用法介绍
下面内容是本作者从官网中看对应的教程后所做的demo.其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方.. 还请各位读者批判性对待... 本文主要介绍在Json数据的序列化 ...
- c#中对json数据的序列化和反序列化(笔记)
今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...
- 详解电子表格中的json数据:序列化与反序列化
从XML到JSON 当下应用开发常见的B/S架构之下,我们会遇到很多需要进行前后端数据传输的场景.而在这个传输的过程中,数据通过何种格式传输.方式是否迅速便捷.书写方式是否简单易学,都成为了程序员在开 ...
- C# 编写通用的JSON数据进行序列化和反序列化
注意事项:使用JSON系列化和反系列化,必须要添加引用System.Runtime.Serialization. 1.通用类代码如下: /// <summary> /// JSON序 ...
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- asp.net的JSON数据进行序列化和反序列化
先要引用在程序集 System.Web.Extensions.dll 的类库,在类中 using System.Web.Script.Serialization 命名空间. 1.定义一个强类型的类(m ...
- java分享第十三天(fastjson生成和解析json数据,序列化和反序列化数据)
fastjson简介:Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack ...
- C#json数据的序列化和反序列化(将数据转换为对象或对象集合)
引用 System.Runtime.Serialization.Json
- .net core Json字符串的序列化和反序列化通用类源码,并模拟了10万数据对比DataContractJsonSerializer和Newtonsoft性能
我们在开发中Json传输数据日益普遍,有很多关于Json字符串的序列化和反序列化的文章大多都告诉你怎么用,但是却不会告诉你用什么更高效.因为有太多选择,人们往往会陷入选择难题. 相比.NET Fram ...
随机推荐
- 用phpstudy配置网站遇到的一些问题
第一次是配置在我本机,总是连不上数据库,后来查看到mysql.ini配置文件里面端口号有一个不是3306,更改之后就好了. 第二次是配置在笔记本电脑上,安装的时候比较顺利,也就遇到80端口被占用还有缺 ...
- 求$N^N$的首位数字
正如"大得多"定理所言,当$n\longrightarrow \infty$时: $$ n^n \gg n! \gg a^n \gg n^b \gg ln^kn $$ $f(n) = n^n$的增长 ...
- 关于安装angular-cli环境报错的问题
最近使用angular2,需要安装angular cli环境 然后使用官网教程命令执行 npm install -g @angular/cli 出现异常如下图: 说找不到python2,我已经安装了p ...
- Unix/Linux系统的发展史
Unix/Linux系统相信是学编程的人都认识这两个系统.我们知道Unix要钱,而Linux免费,而且这两者之间的发展史是什么样的,是不是两者就是同一个东西呢? 我将会以时间的发展过程来一步步的给大家 ...
- base64位代码转图片文件并保存到文件夹的解决方案
#region Base64 转图片方法 protected string Base64StringToImage(string strbase64) { try { string imgurl = ...
- python--第十七天总结(Django)
基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: pytho ...
- MyCP(课下作业,必做)- 20175218
MyCP(课下作业,必做) 1.任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2 ...
- Ubuntu 通过apt安装VSCode
1. sudo vim /etc/apt/sources.list.d/vscode.list 并向里面添加:deb [arch=amd64] http://packages.microsoft.co ...
- 企业BGP网络规划案例(二)
设计思路梳理 1.AS的划分 : 由于该办公网物理上被划分为总部和两个异地的办公分支,总部和分支互联采用MSTP线路,为了方便管理和更为灵活的进行路由控制,选择BGP作为总部和分支的路由协议.关于AS ...
- paloalto防火墙版本升级
1.准备工作:此部分不影响生产环境,可直接操作. 1)备份: 2)下载OS HA情况下,在主机下载完成后,选择 Sync To Peer(同步到对端)同步到备机. 2.安装更新 1)在备机上选择安装 ...