C#使用Json.Net进行序列化和反序列化及定制化

作者:laozhang 时间:2023-07-10 19:11:35 

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

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

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


private class MyClass
{
 public int MyNum;
 public string MyStr;
}

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


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

其打印结果:


{"MyNum":10,"MyStr":"Hello World"}

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


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

此时打印结果为:


{
"MyNum": 10,
"MyStr": "Hello World"
}

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

对于给定的字符串:


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

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


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

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

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


string jsonStr = @"{""MyNum"": 10,""MyStr"": ""Hello World""}";
JObject jObject = JObject.Parse(jsonStr);
Console.WriteLine(jObject.ToString(Formatting.None)); //{"MyNum":10,"MyStr":"Hello World"}
//打印一条属性的值
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#中,定制化的配置通常使用特性来完成,这里也不例外,例如简单的,在序列化/反序列时忽略某个字段/属性:


private class MyClass
{
 [JsonIgnore]
 public int MyNum;
 public string MyStr;
}

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

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

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


/// <summary>
/// 自定义布尔类型数据转换规则
/// </summary>
public class MyBoolConverter : JsonConverter
{
 private const string TrueStr = "TRUE";
 private const string FalseStr = "FALSE";
 public override bool CanConvert(Type objectType) => true;

//反序列化
 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
 {
   if (reader.ValueType == typeof(string))
   {
     if ((string)reader.Value == TrueStr)
     {
       return true;
     }
     else
     {
       return false;
     }
   }
   return false;
 }

//序列化
 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
 {
   if (value.GetType() == typeof(bool))
   {
     bool result = (bool)value;
     if (result)
     {
       writer.WriteValue(TrueStr);
     }
     else
     {
       writer.WriteValue(FalseStr);
     }
   }
 }
}

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


private class MyClass
{
 [JsonConverter(typeof(MyBoolConverter))]
 public bool MyBool;
}

此时:


string jsonStr = @"{""MyBool"": ""TRUE""}";
MyClass1 myClass = JsonConvert.DeserializeObject<MyClass1>(jsonStr);
Console.WriteLine(myClass.MyBool); //True
Console.WriteLine(JsonConvert.SerializeObject(myClass)); //{"MyBool":"TRUE"}
标签:C#,Json.Net,序列化
0
投稿

猜你喜欢

  • JAVA包装类及自动封包解包实例代码

    2022-10-23 13:28:54
  • 通过实例了解Java 8创建Stream流的5种方法

    2023-04-13 22:41:02
  • Spring Boot集成Spring Cache过程详解

    2023-08-02 19:20:16
  • 详解c# 多态

    2021-12-07 07:12:40
  • Android中检查、设置默认程序详解

    2021-08-25 14:14:21
  • Unity 如何通过反射给gameObject添加组件

    2022-06-14 20:58:34
  • 深入理解java中的重载和覆盖

    2023-01-05 00:24:22
  • 在Struts2中如何将父类属性序列化为JSON格式的解决方法

    2022-08-01 09:30:34
  • El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式

    2023-11-24 12:47:13
  • Spring注解@Scope原理及用法解析

    2023-12-06 14:08:17
  • Java中抓取 Thread Dumps 的方式汇总

    2021-08-09 23:20:26
  • Java CAS原子操作详解

    2023-05-06 15:37:15
  • 基于springboot i18n国际化后台多种语言设置的方式

    2022-03-28 16:02:56
  • Java封装公共Result结果返回类的实现

    2023-06-17 08:47:47
  • Java中logback 自动刷新不生效的问题解决

    2022-09-07 21:26:04
  • C语言代码实现三子棋小游戏

    2023-04-16 02:12:41
  • 详解java中产生死锁的原因及如何避免

    2022-04-22 00:36:14
  • 一文了解自定义MVC框架实现

    2023-01-11 00:15:10
  • Java如何在 Word 中设置上、下标

    2023-10-15 21:04:10
  • JPA多数据源分布式事务处理方案

    2023-08-09 03:50:06
  • asp之家 软件编程 m.aspxhome.com