.NET处理Json的几种方式
序列化里的xml,soap,binary在上一篇文章里面已经说过了,这篇主要说json。
json是目前非常流行的一种序列化数据的方式,很多api都采用的是json,结构简洁,容易理解,适用性强,逐渐代替之前的xml在各个数据传输和存储的领域的使用,比如VS Code的配置文件:

json格式的结构很简单,分号隔开的键值堆构成,逗号隔开,{}表示对象,[]表示集合,值可以是数字,字符串,布尔,数组,对象,null,其他的一些细节请看规范资料即可。
下面就说说json序列化的几种方式:
JavaScriptSerializer类
需要给项目引用System.Web.Extensions.dll,命名空间是System.Web.Script.Serialization,被序列化的类无需加任何特性
序列化和反序列化的代码如下:
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(p);
Console.WriteLine(json);
Console.WriteLine("Serialization Done");
Person new_p = js.Deserialize<Person>(json);
Console.WriteLine(new_p.Name);
DataContractJsonSerializer类
需要引用System.Runtime.Serialization.dll,命名空间System.Runtime.Serialization.Json,被序列化的类需要加WCF数据契约一样的特性来显式声明。
[DataContract]
public class Person
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string Major { get; set; }
}
序列化代码如下:
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
MemoryStream ms = new MemoryStream();
js.WriteObject(ms,p);
ms.Position = 0;
string json = Encoding.Default.GetString(ms.ToArray());
Console.WriteLine(json);
MemoryStream ms_new = new MemoryStream(Encoding.Default.GetBytes(json));
Person pp = js.ReadObject(ms_new) as Person;
Console.WriteLine(pp.Name);
可以看出这个方式操作的是流,所以略微繁琐一些。
Json.NET类库,也就是大名鼎鼎的Newtonjson
Json.NEt类库,地址https://www.newtonsoft.com/json
功能很多很强大,我这里也只说一下最基本的。
直接通过Nuget可以安装到项目中。

这是它的命名空间,平常用到最多的是Newtonsoft.Json这个。常用到的类是JsonConvert工具类,方法DeserializeObject,DeserializeObject<T>,SerializeObject。
直接上代码,很容易看,这种泛型方法可以直接转换成对象:
var json = JsonConvert.SerializeObject(p);
Console.WriteLine(json);
var pp = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(pp.Name);
var jobj = JsonConvert.DeserializeObject(json) as JObject;
Console.WriteLine(jobj.GetType());
foreach (var item in jobj)
{
Console.WriteLine($"{item.Key}:{item.Value}");
}
而要将一个json结构很方便的转换为C#类,有专门的转化网站,但最简单的还是VS的选择性粘贴功能。
使用方法是:新建一个空cs文件,里面的东西都删除干净。然后复制json内容,选择VS的编辑菜单的选择性粘贴功能,里面有将json粘贴为类和将xml粘贴为类,有些转换过来不符合.NET规范的可以通过DataContract或者DAtaMemember进行注解。

当然,也可以直接使用dynamic类型来实现对应功能,优缺点其实也就是dynamic的优缺点。
var json = JsonConvert.SerializeObject(ps);
Console.WriteLine(json);
dynamic persons = JsonConvert.DeserializeObject<dynamic>(json);
foreach (var item in persons)
{
Console.WriteLine(item.Name);
}
参考文章
.NET处理Json的几种方式的更多相关文章
- c#操作json的两种方式
总结一下C#操作json的两种方式,都是将对象和json格式相转. 1.JavaScriptSerializer,继承自System.Web.Script.Serialization private ...
- python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
- MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式。
原文链接:https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1.在WebApiConfig的Re ...
- js中将字符串转换成json的三种方式
1,eval方式解析,恐怕这是最早的解析方式了.如下: function strToJson(str){ var json = eval('(' + str + ')'); return json; ...
- SpringMVC 返回json的两种方式
前后台数据交互使用json是一种很重要的方式.本文主要探讨SpringMVC框架使用json传输的技术. 请注意,本文所提到的项目使用Spring 版本是4.1.7,其他版本在具体使用上可能有不一样的 ...
- Java中将xml文件转化为json的两种方式
原文地址https://blog.csdn.net/a532672728/article/details/76312475 最近有个需求,要将xml转json之后存储在redis中,找来找去发现整体来 ...
- 字符串转换成JSON的三种方式
采用Ajax的项目开发过程中,经常需要将JSON格式的字符串返回到前端,前端解析成JS对象(JSON ).ECMA-262(E3) 中没有将JSON概念写到标准中,但在 ECMA-262(E5) 中J ...
- ajax操作json的三种方式
一. 什么是json? 1. JSON是一种轻量级的数据交换格式 2. JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在 ...
- C#解析json的两种方式
C#中Json转换主要使用的几种方法! 这篇主要介绍2.4.第三种方法使用的比较局限,所以我没有深入学习. 第二种方法 我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A.利用seri ...
随机推荐
- 虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File
http://blog.csdn.net/zj510/article/details/39400087 内存管理有三种方式: 1. 虚拟内存,VirtualAlloc之类的函数 2. 堆,Heapxx ...
- BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...
- RLE Iterator LT900
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- mysql安装后找不到sock文件
mysql rpm安装方式之后,启动找不到sock文件,经排查是之前安装的由mysql, 需要时yum list installed mysql 或者 rpm -qa |grep -i mysql ...
- Kafka设计解析(一)Kafka背景及架构介绍
转载自 技术世界,原文链接 Kafka设计解析(一)- Kafka背景及架构介绍 本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比.并介绍了Kafka的架构,Pr ...
- SQLite加密方式 [转]
关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). ...
- oracle 子查询 where having from ,from子查询提高效率
where 子查询主要功能是控制数据行的,返回结果一般都是单行单列.多行单列.单行多列数据 单行单列 SELECT * FROM emp WHERE hiredate=( SELECT MIN(hir ...
- mysql 系统用户最大文件打开数限制
纸上得来终觉浅,绝知此事多宕机...记录一下自己很蠢的一次故障处理过程. 上周的时候,一个刚上线的系统又开始反映登不上了,因为最近这个系统也老是出现这个问题,开发也一直在找问题中,所以也没太在意.于是 ...
- 微信公众号发送消息模板(java)
这段时间接触公众号开发,写下向用户发送消息模板的接口调用 先上接口代码 public static JSONObject sendModelMessage(ServletContext context ...
- MacOS在Finder中建立快速新建txt的workflow
Mac是不支持右键直接新建txt的,因此有时候需要用到文本文稿的时候会比较麻烦. 因此这里提供一种个人认为比较方便的方法,让Mac也能很简洁的新建txt文件. 工具介绍: Automator ...