.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 ...
随机推荐
- 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
import java.util.ArrayList; import java.util.Scanner; public class Text { @SuppressWarnings("re ...
- 【原创】大叔经验分享(52)ClouderaManager修改配置报错
Cloudera Manager中修改配置可能报错: Incorrect string value: '\xE7\xA8\x8B\xE5\xBA\x8F...' for column 'MESSAGE ...
- java web开发环境配置系列(二)安装tomcat
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<java web开发环境配置系列>来祭奠那逝去的…… 1.下载tomcat压缩包,进入官网http: ...
- 改变文件上传input file类型的外观
当我们使用文件上传功能时,<input type="file">,但是外观有点不符合口味,如何解决这个问题? <input type="file&quo ...
- grep, sed 与 awk 补补课,到底怎么用!
grep, sed 与 awk 相当有用 ! gerp 查找, sed 编辑, awk 根据内容分析并处理. awk(关键字:分析&处理) 一行一行的分析处理 awk '条件类型1{动作1}条 ...
- C语言程序设计I—第十一周教学
第十一周教学总结(12/11-17/11) 教学内容 第4章 循环结构-break continue嵌套循环 4.3 判断素数,4.4求1! + 2! + -. + 100! 课前准备 在蓝墨云班课发 ...
- P1776 宝物筛选_NOI导刊2010提高(02)
题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...
- oracle 判断字段相等,但类型不同引起的性能问题
最近做ogg数据同步,然后触发器加工数据放入另外一张表,由于数据量很大,一分钟几万条数据,由于一些条件字段类型不匹配,引起ogg阻塞,比较头大.最后分析发现性能问题.请看下图: phmxxh是varc ...
- 在windows上安装不同(两个)版本的Mysql数据库
1.起因: 需要导入一个sql文件,发现死活导不进去.当执行到这一句时,就有问题.经过一番搜索,原来是我的数据库版本(原先Mysql版本5.5)低了,而支持该语句的版本应该是至少要5.7.那我索性就去 ...
- [控件] Firemonkey 跨平台 Toast
控件说明:一个简单的讯息提示功能,使用 FMX 基本控件,因此支持 Win, macOS, iOS, Android 平台. 已知问题:如果使用了 WebBrowser, MapView... 等原生 ...