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

 更新时间:2019-05-26 17:00:48   作者:佚名   我要评论(0)

序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则

序列化(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进行序列化和反序列化及定制化全部知识点内容,感谢大家对脚本之家的支持。

您可能感兴趣的文章:

  • C#实体对象序列化成Json并让字段的首字母小写的两种解决方法
  • C#中Json反序列化的实现方法
  • C#中 Json 序列化去掉null值的方法
  • C#使用JavaScriptSerializer序列化时的时间类型处理
  • C# JavaScriptSerializer序列化时的时间处理详解
  • C#中序列化实现深拷贝,实现DataGridView初始化刷新的方法

相关文章

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

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

    序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化(Deserialize)则
    2019-05-26
  • C#SuperSocket的搭建并配置启动总结

    C#SuperSocket的搭建并配置启动总结

    之前我们借助一个SuperSocket实现了一个简易版的服务器, 但是不管是Server还是Session都是使用框架的,本篇博客我们要实现自己的Server和Session,来重写框架原
    2019-05-26
  • C#编程中常见数据结构的比较(Unity3D游戏开发)

    C#编程中常见数据结构的比较(Unity3D游戏开发)

    一.前言 Unity3D是如今最火爆的游戏开发引擎,它可以让我们能轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型的互动内容。它支持2D/3D游戏开发,
    2019-05-26
  • numpy linalg模块的具体使用方法

    numpy linalg模块的具体使用方法

    最近在看机器学习的 LogisticRegressor,BayesianLogisticRegressor算法,里面得到一阶导数矩阵g和二阶导数Hessian矩阵H的时候,用到了这个模块进行求解运算,
    2019-05-26
  • Docker私服仓库Harbor安装的步骤详解

    Docker私服仓库Harbor安装的步骤详解

    Harbor安装那里还是很简单,就是在Docker Login那里掉坑里去了,搞半天,写博客的时候,又重新安装了一遍 1.准备两台服务器 centos7 harbor 10.19.46
    2019-05-26
  • python numpy实现文件存取的示例代码

    python numpy实现文件存取的示例代码

    NumPy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式
    2019-05-26
  • .NET Core 3.0之创建基于Consul的Configuration扩展组件

    .NET Core 3.0之创建基于Consul的Configuration扩展组件

    经过前面三篇关于.NET Core Configuration的文章之后,本篇文章主要讨论如何扩展一个Configuration组件出来。 了解了Configuration的源码后,再去扩展一个组件
    2019-05-26
  • 使用JS判断页面是首次被加载还是刷新

    使用JS判断页面是首次被加载还是刷新

    1 利用window.name属性在页面刷新时不会重置判断(在该属性空置的情况下可使用) if(window.name == ""){ console.log("首次被加载"); window.name = "is
    2019-05-26
  • 分享一个vue项目“脚手架”项目的实现步骤

    分享一个vue项目“脚手架”项目的实现步骤

    搭建缘由 源于公司每次新启动一个由多人协同开发的项目都由负责人初始化项目之后,每个人再去从私服pull一下项目才开始开发。但是每次初始化工程都是一步步的
    2019-05-26
  • Android仿微博个人详情页滚动到顶部的实例代码

    Android仿微博个人详情页滚动到顶部的实例代码

    个人详情页滑动到顶部 最近产品提了个新需求,需要实现点击App内的某个按钮跳转到个人详情页并且滑动到顶部,个人详情页的页面交互稍微复杂,技术角度上包含了
    2019-05-26

最新评论