序列化里的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工具类,方法DeserializeObjectDeserializeObject<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);
}

参考文章

在C#中,Json的序列化和反序列化的几种方式总结

Json的序列化与反序列化

Json教程

.NET处理Json的几种方式的更多相关文章

  1. c#操作json的两种方式

    总结一下C#操作json的两种方式,都是将对象和json格式相转. 1.JavaScriptSerializer,继承自System.Web.Script.Serialization private ...

  2. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  3. MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式。

    原文链接:https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1.在WebApiConfig的Re ...

  4. js中将字符串转换成json的三种方式

    1,eval方式解析,恐怕这是最早的解析方式了.如下: function strToJson(str){ var json = eval('(' + str + ')'); return json; ...

  5. SpringMVC 返回json的两种方式

    前后台数据交互使用json是一种很重要的方式.本文主要探讨SpringMVC框架使用json传输的技术. 请注意,本文所提到的项目使用Spring 版本是4.1.7,其他版本在具体使用上可能有不一样的 ...

  6. Java中将xml文件转化为json的两种方式

    原文地址https://blog.csdn.net/a532672728/article/details/76312475 最近有个需求,要将xml转json之后存储在redis中,找来找去发现整体来 ...

  7. 字符串转换成JSON的三种方式

    采用Ajax的项目开发过程中,经常需要将JSON格式的字符串返回到前端,前端解析成JS对象(JSON ).ECMA-262(E3) 中没有将JSON概念写到标准中,但在 ECMA-262(E5) 中J ...

  8. ajax操作json的三种方式

    一. 什么是json? 1. JSON是一种轻量级的数据交换格式 2. JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在 ...

  9. C#解析json的两种方式

    C#中Json转换主要使用的几种方法! 这篇主要介绍2.4.第三种方法使用的比较局限,所以我没有深入学习. 第二种方法 我使用比较多的方式,这个方法是.NET内置的,使用起来比较方便 A.利用seri ...

随机推荐

  1. django下载excel,使用django-excel插件

    django下载Excel,使用django-excel插件 由于目前的资料多是使用pandas或xlwt库实现的.其实没有那么的麻烦,因为django有相对应的插件django-excel. 该插件 ...

  2. Java实现数据库操作

    Java实现数据库操作 这里的样例是使用mysql数据库 代码实现 /* MySQLHelper.java */ import java.io.*; import java.util.*; impor ...

  3. [转]Apache HTTP Server 与 Tomcat 的三种连接方式介绍

    首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...

  4. Linux下Meepops的搭建

    1.下载跟版本相对应的扩展 http://br.php.net/downloads.php 2.进入到pcntl目录 cd php-5.4.45/ext/pcntl 3.先执行phpize /usr/ ...

  5. Redis(五)主从复制

    本文转载自编程迷思,原文链接 深入学习Redis(3):主从复制 前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包 ...

  6. FFmpeg中几个结构体的意义

    AVCodec是存储编解码器信息的结构体,特指一个特定的解码器,比如H264编码器的名字,ID,支持的视频格式,支持的采样率等: AVCodecContext是一个描述编解码器采用的具体参数,比如采用 ...

  7. Entity Framework Code First 遭遇主键自动生成问题

    4.0后就没有去跟踪后面的版本了.现在直接开始用5.0没想到在做User的GURD时就遭遇insert不进数据问题. ISet<User>.Add(user);_context.SaveC ...

  8. java ssm 后台框架平台 项目源码 websocket即时聊天发图片文字 好友群组 SSM源码

    官网 http://www.fhadmin.org/D 集成安全权限框架shiro  Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安全,更可靠E ...

  9. Oracle 的存储过程以及用jdbc调用存储过程

    存储过程 就是一组用于完成特定功能的PL/SQL 具名语句块,该SQL语句集经过编译后存储在数据库系统中.在使用时候,我们只需要通过指定已经定义的存储过程名字并给出对应的参数来执行  存储过程的定义语 ...

  10. block本质探寻一之内存结构

    一.代码——命令行模式 //main.m #import <Foundation/Foundation.h> struct __block_impl { void *isa; int Fl ...