序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程;在.Net阵营中,Json.Net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:https://www.newtonsoft.com/json

  一、将对象序列化为Json格式字符串

  首先是正常的序列化操作,对于给定的类:

  1. private class MyClass
  2. {
  3. public int MyNum;
  4. public string MyStr;
  5. }

  将该类的实例序列化为Json格式字符串,首先引用命名空间Newtonsoft.Json:

  1. MyClass myClass = new MyClass { MyNum = 10, MyStr = "Hello World" };
  2. Console.WriteLine(JsonConvert.SerializeObject(myClass));

  其打印结果:

  1. {"MyNum":,"MyStr":"Hello World"}

  在打印到本地Log文件以供自己查看使用时,可以选择转换为带有缩进的Json格式字符串:

  1. Console.WriteLine(JsonConvert.SerializeObject(myClass, Formatting.Indented));

  此时打印结果为:

  1. {
  2. "MyNum": ,
  3. "MyStr": "Hello World"
  4. }

  二、将Json格式字符串反序列化为对象

  对于给定的字符串:

  1. string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";

  将其反序列化为MyClass类型的对象:

  1. MyClass myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
    Console.WriteLine(myClass.MyStr); //Hello World

  三、使用JObject动态序列化/反序列化

  以上例子都是使用强类型进行序列化和反序列操作,但有时也会用到不指定类型而直接操作Json格式数据的情况,此时就需要用位于命名空间ewtonsoft.Json.Linq中的JObject类型的对象:

  1. string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";
  2. JObject jObject = JObject.Parse(jsonStr);
  3. Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World"}
  4. //打印一条属性的值
  5. Console.WriteLine(jObject["MyStr"].Value<string>()); //Hello World
    //添加一条属性
    jObject.Add("MyStr2", "HaHa");
    //打印当前Json字符串
    Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World","MyStr2":"HaHa"}

  四、定制化序列化/反序列过程

  1.在C#中,定制化的配置通常使用特性来完成,这里也不例外,例如简单的,在序列化/反序列时忽略某个字段/属性:

  1. private class MyClass
  2. {
  3. [JsonIgnore]
  4. public int MyNum;
  5. public string MyStr;
  6. }

  此时,无论序列化还是反序化时,字段MyNum都不再参与这些过程;

  2.自定义某个字段/属性的序列化/反序列化规则:

  当接收到的Json格式字符串与本地已有类型不统一时,需要进行自定义的反序列化过程,反之亦然,例如Json字符串中以字符串"TRUE"表示布尔类型true(不自定义,这个过程依然走的通,只是以此举例),以字符串"FALSE"表示布尔类型false时,需要自定义如下:

  1. /// <summary>
  2. /// 自定义布尔类型数据转换规则
  3. /// </summary>
  4. public class MyBoolConverter : JsonConverter
  5. {
  6. private const string TrueStr = "TRUE";
  7. private const string FalseStr = "FALSE";
  8. public override bool CanConvert(Type objectType) => true;
  9.  
  10. //反序列化
  11. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  12. {
  13. if (reader.ValueType == typeof(string))
  14. {
  15. if ((string)reader.Value == TrueStr)
  16. {
  17. return true;
  18. }
  19. else
  20. {
  21. return false;
  22. }
  23. }
  24. return false;
  25. }
  26.  
  27. //序列化
  28. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  29. {
  30. if (value.GetType() == typeof(bool))
  31. {
  32. bool result = (bool)value;
  33. if (result)
  34. {
  35. writer.WriteValue(TrueStr);
  36. }
  37. else
  38. {
  39. writer.WriteValue(FalseStr);
  40. }
  41. }
  42. }
  43. }

  然后,在需要操作的类型定义中的字段/属性中加入该特性:

  1. private class MyClass
  2. {
  3. [JsonConverter(typeof(MyBoolConverter))]
  4. public bool MyBool;
  5. }

  此时:

  1. string jsonStr = @"{""MyBool"": ""TRUE""}";
  2. MyClass1 myClass = JsonConvert.DeserializeObject<MyClass1>(jsonStr);
  3. Console.WriteLine(myClass.MyBool); //True
  4. Console.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

在C#中使用Json.Net进行序列化和反序列化及定制化的更多相关文章

  1. 【转】在C#中使用Json.Net进行序列化和反序列化及定制化

    作者:Minotauros 原文地址:在C#中使用Json.Net进行序列化和反序列化及定制化 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态, ...

  2. 详解电子表格中的json数据:序列化与反序列化

    从XML到JSON 当下应用开发常见的B/S架构之下,我们会遇到很多需要进行前后端数据传输的场景.而在这个传输的过程中,数据通过何种格式传输.方式是否迅速便捷.书写方式是否简单易学,都成为了程序员在开 ...

  3. c#中对json数据的序列化和反序列化(笔记)

    今天遇到在后台中要获取json格式数据里的某些值,网上查了些资料: string jsonstr = _vCustomerService.LoadCustomerbyNumTotalData(quer ...

  4. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  5. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  6. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  7. 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

    "/"应用程序中的服务器错误.使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. ...

  8. 对 JSON 数据进行序列化和反序列化

    如何:对 JSON 数据进行序列化和反序列化 2017/03/30 作者 JSON(JavaScript 对象符号)是一种高效的数据编码格式,可用于在客户端浏览器和支持 AJAX 的 Web 服务之间 ...

  9. 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错

    如题 报错提示: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值.","Sta ...

随机推荐

  1. 第1节 flume:13、14、更多flume案例一,通过拦截器实现不同类型的数据区分

    1.6.flume案例一 1. 案例场景 A.B两台日志服务机器实时生产日志主要类型为access.log.nginx.log.web.log 现在要求: 把A.B 机器中的access.log.ng ...

  2. windows搭建gcc开发环境(msys2) objdump

    前言 可能你并不太了解msys2,但是作为一个程序员,你一定知道mingw,而msys2就集成了mingw,同时msys2还有一些其他的特性,例如包管理器等. msys2可以在windows下搭建一个 ...

  3. 给 MSYS2 添加国内源

    https://wiki.qt.io/MSYS2pacman -S base-devel git mercurial svn wget p7zip软件包 开发包 http://mirrors.ustc ...

  4. prototype中的ajax异步加载

    jquery前台处理: var param = {a:a}; $.post("*.do",param,function(data) { var columHtml = " ...

  5. C++的反射

    写得挺不错,支持转帖下 C++语言本身是不支持反射的,但实际应用中总是会有将对象序列化的需求,总不可能C++不支持,我们就不用C++了,既然发明C++的大师们没有考虑这个,那我们只有自己动手了,毛主席 ...

  6. python:mysql增量备份

    模块:MySQLdb Crypto加密 ConfigParser加载配置 mydb.py #!/usr/bin/env python #coding=utf-8 import MySQLdb as m ...

  7. Linux菜鸟起飞之路【三】Linux常用命令

    一.Linux命令的基本格式 命令 [选项] [参数] a)命令:就是告诉操作系统要做什么 b)选项:说明命令的运行方式,有的会改变命令的功能,选项通常以“-”开始 c)参数:说明命令的操作对象,如文 ...

  8. mem之读操作调式总结(跟入栈出栈有关)

    现象: 1.当case比较复杂的时候(含有for循环对mem进行读/写) 发现for循环时总是有汇编指令不执行跳过去了,(其实是汇编不熟和指令太多无法理智分析指令了). 事实是指令是对的,但执行错了( ...

  9. shell-code-5-流程控制

    ××××××××××××××××××××IF-ELSE×××××××××××××××××××××××××××××× a=1b=2if [ $a == $b ]then echo a等于belif [ ...

  10. Cypress EZ-USB FX3 DMA模式下的串口通讯

    由于公司设备升级后出了问题,需要对USB驱动进行修改,原本使用的是寄存器模式进行UART传输,但是由于FX3寄存器模式会出现长时间延时等待的问题,不得不对其传输模式进行修改.虽然赛普拉斯的EZ-USB ...