.Net SDK中关于序列化和反序列化Json的方法
项目中遇到和服务端交互时需要传递数据包为json格式的包,所以在服务端和SDK中都需要对json进行解析和组合的操作, 并且对一些复杂结构的json格式的解析和序列化比较麻烦, 幸好,.Net提供一些方法的库可以帮助我们完成一些工作,下面介绍一下利用.Net中的Newtonsoft.Json.dll库对json进行序列化和反序列化操作。

Json操库的介绍:
.NET自身有System.Runtime.Serialization.dll与System.Web.Extensions.dll,使用这两个DLL可以把对象序列化和反序列化成Json数据。
也可以使用第三方的Newtonsoft.Json.dll来操作Json数据,使用它会更方便的操作Json数据,其功能也跟强一些。
但是:使用System.Web.Extensions.dll的限序列化, 一般不怎么使用,因为:要使用System.Web.Extensions.dll必须是在Web项目中,只有在Web项目中才能引用此DLL。
并且前两种方式在项目中也没怎么用过,所以主要介绍第三种方式,利用Newtonsoft.Json.dll来操作json.
首先要将该动态库加入到项目中,在.Net项目中直接添加引用即可。
1、 序列化
1.1 一般格式
要想得到一个最正常的以下格式的json结构:

{"status": "create","subject": "envelope demo,sent recipients","message": "demo sign...","senderId": "0638bb2d-74c1-494b-ba50-e7caaf09ca77","projectKey": "10000006"
}  

以下方法实现:
直接给json逐个字段构造

public class Json{JObject json { get; set; }public string GetJson(){this.json = new JObject();this.json["status"] = "create"; this.json["subject"] = "envelope demo";this.json["message"] = "demo";this.json["senderId"] = "0638bb2d";this.json["projectKey"] = "10000006";return this.json.ToString();}
}

返回结果:

 Json objjson = new Json();string json = objjson.GetJson();

返回json为上面我们指定格式的字符串。
1.2 对象
将对象直接格式化为json字符串。
Eg:public class Json
{
public string status { set; get; }
public string subject { set; get; }
public string message { set; get; }
public string senderId { set; get; }
public string projectKey { set; get; }
}

直接序列化:
Json objjson = new Json();
objjson.status = "create";………
string jsonData = JsonConvert.SerializeObject(objjson);

返回结果和上面一样的字符串, 前提是先给对象赋值, 如果不复制返回下面内容:

{"status":null,"subject":null,"message":null,"senderId":null,"projectKey":null}

注意:json key的名称和对象中的一样。 按照这样的逻辑,发序列化对象的名称要和json一样才能将其反序列化出来。
1.3 数组
使用List构造数组进行序列化,首先定义对象,构造格式;
如果想得到下列格式的json:

"documents":    [{ "name": "demo.pdf","fileKey": "$08ac5875-345a-4339-a6a3-fca02a85ba92$180375027","templateRequired": "false","templateId": "","type": "pdf"}, { "name": "demo2.pdf", "fileKey": "$08ac5875-325a-4339-a6a3-fca02a85ba92$180375046", "templateRequired": "false", "templateId": "", "type": "pdf"}]

则使用对象序列化;

  public class DocInfo {public string Name { set; get; }public string FileKey { set; get; }public string  TemplateRequired { set; get; }public string TemplateId { set; get; }public string Type { set; get; }
}
Void Main()
{
List<DocInfo> list = new List<DocInfo>();DocInfo info = new DocInfo();info.Name = "demo.pdf";info.FileKey = "$08ac5875 - 325a - 4339 - a6a3 - fca02a85ba92$180375046";info.TemplateRequired = "false";info.Type = "pdf";list.Add(info);info.Name = "demo2.pdf";info.FileKey = "$08ac5875-325a-4339-a6a3-fca02a85ba92$180375046";list.Add(info);string jsonStr = JsonConvert.SerializeObject(list);//将对象转换成json存储
this.Json["documents"] = JArray.Parse(strRecipients);
}

得到的便是以上我们定义的结构了;
1.4 嵌套格式
对于嵌套格式,通常都是由以上的三点的简单格式组成的,将其拆分合成后,组合到一起便可以了,或者定义对应结构的对象, 直接进行序列化即可完成。
2、 反序列化
2.1一般格式
解析如下格式:

string jsonText = "{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}";
void main()
{
JObject jo = JObject.Parse(jsonData);
或者JObject jo = (JObject)JsonConvert.DeserializeObject(jsonData);string zone = jo["zone"].ToString();
string zone_en = jo["zone_en"].ToString();
}

2.2对象
解析如下格式json:

string strJson =
{"data":{"signedFileKey":"$f605cb35-2c4e-41f3-a16a-3eee41b39556$1638665701","signLogId": "02f1a5ff-d3e4-48df-9684-aed92081d6a7"},"errCode": 0,"errShow": true,"msg": ""
}
定义一个对象:
namespace JsonOper
{
public class JSON
{public int ErrCode { get; set; }public bool ErrShow { get; set; }public string Msg { get; set; }public DATA data { set; get; }
}public class DATA
{public string SignedFileKey { set; get; }public string SignLogId { set; get; }
}
}JSON jo = JsonConvert.DeserializeObject<JSON>(strJson);

得到的结果便是一个反序列化好了的对象。
注:定义发序列化对象时,要对象json格式定义, 比如有嵌套, 对象格式也要嵌套, 否则无法反序列化成功, 并且定义时,对象中的变量名称要和json中一直, 大小写没关系。
Eg:以上例子中

"errCode": 0,
"errShow": true,
"msg": ""

定义时可以定义为:

public class JSON
{public int ErrCode { get; set; }public bool ErrShow { get; set; }public string Msg { get; set; }
}

因为反序列化是对属性的。 对象默认有一个小写字母开头的属性;总之这个无伤大雅。 一般首字母大写。
2.3数组
说来奇怪,项目中反序列化一个嵌套格式的json,定义了一个嵌套对象,但是竟然不成功, 一怒之下, 换了一种方法, 因为懒的去查什么原因了。
大体如下:

Json:
{"data": {"envelope": {"status": "Sent","subject": "envelope demo,sent recipients","message": "demo sign...","redirectUrl": "http://xxxx.xxx.xxx/xxx","notifyUrl": "http://xxxx.xxx.xxx/xxx","senderId": "0638bb2d-74c1-494b-ba50-e7caaf09ca77","senderName": "Wesley","sentDateTime": "2017-08-17T06:55:48.6800000Z","document": {"docUUID": "07ec608d-6840-4856-b599-783843efcdb6","signFileKey": "08ec608d-6840-4856-b599-783843efcdb6","name": "demo.pdf","templateRequired": "false","templateId": "","type": "Pdf"},"recipients": [{"recipientId": "07ec608d-6840-4856-b599-783843efcdb6","flowId": "44ec608d-6840-4856-b599-783843efcbc6","currentHandlerFlag":"true","licenseType": "IDCard","licenseID": "362389xxxxxxxx8766","routingOrder": "1","type": "Signers","email": "123@123.com","phone": "12389978998","accountUniqueId": "23344555","departmentId": "dkdksjj","departmentName": "department A","autoSignFlag": "N","signType": "PatientSign","recipientType": "Personal","status": "Signed","predefineSign": {"posType":"Free","key": "","posX": 0,"posY": 0,"posPage": "1"}},{"recipientId": "07ec608d-6840-4856-b599-783843efcdb6","flowId": "","currentHandlerFlag":"false","licenseType": "IDCard","licenseID": "362389xxxxxxxx8766","routingOrder": "2","type": "CC","email": "123@123.com","phone": "12389978998","accountUniqueId": "23344555","departmentId": "dkdksjj","departmentName": "department B","autoSignFlag": "N","signType": "PatientSign","recipientType": "Personal","status": "Sent","predefineSign": {"posType":"Free","key": "","posX": 0,"posY": 0,"posPage": "1"}}]},"errCode": 0,"errShow": true,"msg": ""}
}

以上结构中,有嵌套对象, 有嵌套数组, 数组中嵌套对象。
解析方法:
定义对象:

namespace xxxx
{public class EnvelopInfoResult : Result{public EnvelopeDataResult EnvelopData { set; get; }}public class EnvelopeDataResult{public string Status { set; get; }public String SubJect { set; get; }public String Message { set; get; }public String SenderId { set; get; }public String SenderName { set; get; }public string SentDateTime { set; get; }public DocInfoResult Document { set; get; }public List<RecipientsInfoPersonResult> PersonRecipientsInfos { set; get; }public List<RecipientsInfoDepartResult> DepartRecipientsInfos { set; get; }}public class DocInfoResult{public string DocUUID { set; get; }public string SignFileKey { set; get; }public string Name { set; get; }public string TemplateRequired { set; get; }public string TemplateId { set; get; }public string Type { set; get; }}public class PositionBeanResult{public string posType { set; get; }public string PosPage { set; get; }public string Key { get; set; }public float PosX { get; set; }public float PosY { get; set; }public float Width { get; set; }}public class RecipientsReturn : Recipients
{public string licenseType { set; get; } public string licenseID { set; get; }        public string email { set; get; }public string phone { set; get; }public string accountUniqueId { set; get; }       public string recipientType { set; get; }          public string departmentId { set; get; }          public string autoSignFlag { set; get; }public string signType { set; get; }   public string ReciepientId { set; get; }public string FlowId { set; get; }public string CurrentHanderFlag { set; get; }  public string DepartmentName { set; get; }public string Status { set; get; }}
}

将json解析到以上定义对象中:

  JObject json = (JObject)JsonConvert.DeserializeObject(strJson);//转换为对象EnvelopInfoResult  result = EnvelopInfoResult.ParseJson(json);public static EnvelopInfoResult ParseJson(JObject json){EnvelopInfoResult res = new EnvelopInfoResult();EnvelopeDataResult data = new EnvelopeDataResult();res.EnvelopData = data;res.ErrCode = int.Parse(json["errCode"].ToString());res.ErrShow = Convert.ToBoolean(json["errShow"].ToString());res.Msg = json["msg"].ToString();//Parse obj//转换为对象var obj = json["data"]["envelope"].ToObject<JObject>();//获取对应字段值 res.EnvelopData.Status = obj.GetValue("status").ToString();            res.EnvelopData.SubJect = obj.GetValue("subject").ToString();res.EnvelopData.Message = obj.GetValue("message").ToString();res.EnvelopData.SenderId = obj.GetValue("senderId").ToString();res.EnvelopData.SenderName = obj.GetValue("senderName").ToString();res.EnvelopData.SentDateTime = obj.GetValue("sentDateTime").ToString();//将document对象直接转换为定义的对象res.EnvelopData.Document = obj.GetValue("document").ToObject<DocInfoResult>();// recipients对应的数组部分是一个对象, 获取json将其转换成JArray数组,然后遍历数组获取每个字段对应的值。string strListJson = obj.GetValue("recipients").ToString();JArray jar = JArray.Parse(strListJson);foreach (var nobj in jar){RecipientsReturn rec = nobj.ToObject<RecipientsReturn>();if ("Personal" == rec.recipientType){res.EnvelopData.PersonRecipientsInfos = new List<RecipientsInfoPersonResult>(); RecipientsInfoPersonResult Recp = new RecipientsInfoPersonResult();Recp.ReciepientId = rec.ReciepientId;Recp.FlowId = rec.FlowId;Recp.CurrentHanderFlag = Convert.ToBoolean(rec.CurrentHanderFlag);Recp.licenseType = GetType<LicenseType>(rec.licenseType);                      Recp.LicenseId = rec.licenseID;Recp.RoutingOrder = rec.routingOrder;Recp.Type = GetType<SendType>(rec.type);Recp.Email = rec.email;Recp.Phone = rec.phone;Recp.AccountUniqueId = rec.accountUniqueId;Recp.SignType = GetType<SignType>(rec.signType);Recp.status = GetType<RecipientStatus>(rec.Status);Recp.PredefineSign = SetPos(rec.predefineSign);res.EnvelopData.PersonRecipientsInfos.Add(Recp);}else{res.EnvelopData.DepartRecipientsInfos = new List<RecipientsInfoDepartResult>();RecipientsInfoDepartResult Recd = new RecipientsInfoDepartResult();Recd.RecipientId = rec.ReciepientId;Recd.FlowId = rec.FlowId;Recd.CurrentHandlerFlag = Convert.ToBoolean(rec.CurrentHanderFlag);Recd.RoutingOrder = rec.routingOrder;Recd.AccountUniqueId = rec.accountUniqueId;Recd.DepartmentId = rec.departmentId;Recd.AutoSignFlag = Convert.ToBoolean(rec.autoSignFlag);Recd.status = GetType<RecipientStatus>(rec.Status);Recd.PredefineSign = SetPos(rec.predefineSign);res.EnvelopData.DepartRecipientsInfos.Add(Recd);}}return res;}

好了,打完收工。

.Net 中关于序列化和反序列化Json的方法相关推荐

  1. OWASP TOP 10(六)反序列化漏洞(序列化和反序列化、漏洞原理、PHP中的序列化和反序列化、魔术方法、Typecho_v1.0中的反序列化漏洞)

    文章目录 反序列化漏洞 一.概述 1. 序列化和反序列化 2. 序列化的目的 二.PHP中的序列化与反序列化 1. 概述 2. 示例序列化与反序列化 3. 反序列化漏洞 - PHP中的魔术方法 - T ...

  2. python中常用的序列化模块_Python中的序列化和反序列化

    为什么要序列化 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中. 设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列.所以必须把数据额转换为字节序列,输出到文件, ...

  3. php中的序列化与反序列化[喜悦原创]

    php中的序列化与反序列化 1.serialize() <===> unserialize(),这个大家用的最多, 老熟人了 session保存默认用的就是这个. 如果想存储对象,数组数据 ...

  4. Unity中的序列化和反序列化

    一:前言 序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程.序列化最主要的用途就是传递对象和保存对象 在Unity中保存和加载.prefab.scene.Inspecto ...

  5. K:java中的序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...

  6. fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...

    点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...

  7. 谈谈:.Net中的序列化和反序列化

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...

  8. java序列化与反序列化的使用方法-java.io.InvalidClassException错误

    java中的序列化和反序列化 Java中序列化的本质就是将类转换成二进制数据进行保存,反序列化就是将二进制数据转换为java中的类的形式 首先一个类能否被序列化取决于它有没有实现Serializabl ...

  9. JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter

    JSON的序列化和反序列化已经成为Web开发必不可少的知识.现在常用的有System.Web.Script.Serialization下的JavaScriptSerializer来进行处理:另外一个比 ...

最新文章

  1. Jrebel 热部署插件的使用和破解
  2. Keras用动态数据生成器(DataGenerator)和fitgenerator动态训练模型
  3. linux中的信号1——信号概述
  4. JAVA 反射练习 打印指定类名的所有信息
  5. maven setting 设置jdk版本
  6. 3D纹理贴图制软件The Foundry Mari for Mac
  7. 阿里矢量图标(字体图标) 、 阴影
  8. 【科研人必备】各大英文期刊投稿必备搜索/文章相关推荐投稿搜索方法
  9. QCC3040---AppDevice module
  10. 2019全球logo设计趋势
  11. Hexo接入码云评论系统
  12. JUC(十)-线程池-ThreadPoolExecutor分析
  13. 行式 Excel 文件拆分
  14. 项目记录—workbench静力分析
  15. stm32h750/stm32h743原理图和pcb源文件
  16. HDOJ3018欧拉路,几笔画判断
  17. 教你怎样用最少的钱拍出最美的婚纱
  18. 学习自旋电子学的笔记01:微磁模拟软件OOMMF的教程(中文版)16章
  19. 矩阵连乘问题算法思想_动态规划-矩阵连乘问题(一)
  20. 【Python基础知识库】Python类的继承

热门文章

  1. 北漂经历 | 我在北京这几年(全)
  2. 付宇泽20190905-1 每周例行报告
  3. 非线性最小二乘法之Gauss Newton、L-M、Dog-Leg9
  4. AMD 显卡/GPU 深度学习折腾指南
  5. amd显卡导致的开机短暂黑屏解决办法
  6. 干货 | 如何在京东云上简单实践CI流程
  7. 成立一家投资管理有限公司的资本是多少?
  8. Jira的安装、使用与集成
  9. Delta Lake 在 Soul 的应用实践
  10. 《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第13章 处理PDF和Word文档(1)】