经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JSON » 查看文章
C#使用Json.Net进行序列化和反序列化及定制化
来源:jb51  时间:2019/5/27 8:31:47  对本文有异议

序列化(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":10,"MyStr":"Hello World"}

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

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

此时打印结果为:

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

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

对于给定的字符串:

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

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

  1. MyClass myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
  2. 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
  6. //添加一条属性
  7. jObject.Add("MyStr2", "HaHa");
  8. //打印当前Json字符串
  9. 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"}

以上就是本次整理的C#使用Json.Net进行序列化和反序列化及定制化全部知识点内容,感谢大家对w3xue的支持。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号