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

序列化(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)

相关推荐

  • C#中Json反序列化的实现方法

    前言 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自行在nuget中导入 Json源数据: var data = "{'jingdong_ldop_receive_trace_get_responce':{'code':'0','querytrace_result':{'data':[{'opeTitle':'快递签收','opeRemark':'货物已交付京东物流','

  • C# JavaScriptSerializer序列化时的时间处理详解

    最近被序列化困扰了一下下.原因看下面代码 class Program { static void Main(string[] args) { var user = new User { UserId = "sb", CreateDate = DateTime.Now }; var serialier = new JavaScriptSerializer(); var json = serialier.Serialize(user); Console.WriteLine(json); C

  • C#中序列化实现深拷贝,实现DataGridView初始化刷新的方法

    winfrom中DataGridView在的单元格在编辑时候会修改它的数据源的,如果我们遇到这样一种情景,刷新数据源到原始状态,这个时候要么数据源的重新获取绑定,要么通过拷贝一份原始档的数据再绑定处理,这里介绍拷贝方式处理. 大致代码如下: 1.目标对需要序列化,并实现ICloneable 接口: [Serializable] public class DtoColumn : ICloneable2.实现接口方法Clone: public object Clone() { using (Memo

  • C#实体对象序列化成Json并让字段的首字母小写的两种解决方法

    引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写. 解决办法有两种: 第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性) public class UserInfo { [JsonProperty("id")] public int Id{ set; get; } [JsonProperty("userName")] public string UserName{ set; get

  • C#使用JavaScriptSerializer序列化时的时间类型处理

    最近在做一个数据交换服务接口,用的 .NET Web API 项目.需要监控每次请求的数据,也就是操作日志.请求数据为实体对象,所以我用了序列化将请求内容读取并写入日志.咋一看,好像并没有什么问题,但是时间却不是我们平常看到的格式.效果图是这样的: 猜测这里是由于 js 初始化时间的时候往往是向 1970/01/01 添加毫秒数,JavaScriptSerializer 进行序列化的时候也会格式化为距离1970/01/01 到当前时间点 GMT+0 时间的毫秒数,如果直接反序列化可以看到少了8小

  • C#中 Json 序列化去掉null值的方法

    要将一个对象序列化,可是如果对象的属性为null的时候,我们想将属性为null的都去掉. 在这里我使用Newtonsoft.Json.dll 记录一下序列化以及反序列化 json字符串转对象 Model model=JsonConvert.DeserializeObject<Model>(val); 将对象转化为json格式字符串 string jsonString = JsonConvert.SerializeObject(obj); 那么如何序列化为json时过滤掉NULL呢?? var

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

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

  • Go语言对JSON数据进行序列化和反序列化

    golang中对json的序列化/反序列化操作还是比较容易的,序列化操作主要是通过encoding/json包的Marshal()方法来实现,反序列化操作主要是通过encoding/json包的Unmarshal()方法来实现. //JSON序列化和反序列化 //可用在api序列化输出 //转成结构体,方便程序操作等 package main import ( "encoding/json" "fmt" ) type Response1 struct { Page

  • java中fastjson生成和解析json数据(序列化和反序列化数据)

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>) 2.通过一个android程序测试fastjson的用法. fastjson简介: Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack

  • C#中实现Json序列化与反序列化的几种方式

    什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 翻译:Json[javascrip

  • ASP.NET中JSON的序列化和反序列化使用说明

    在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含

  • ASPNET中JSON的序列化和反序列化的方法

    一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'""'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等. JSON具有以下的形式: 对象(Object)是一个无序的"名值对"集合,一个对象以"

  • 浅析JavaScriptSerializer类的序列化与反序列化

    JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象.要添加System.Web.Extensions.dll的引用.该类位于System.Web.Script.Serialization命名空间下. 一.属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度. Recursio

  • JSON键值对序列化和反序列化解析

    什么是JSON? JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write and easy for machines to parse and generate. JSON is a text format that is completely language independent. 翻译:Json[javascrip

  • JS实现json的序列化和反序列化功能示例

    本文实例讲述了JS实现json的序列化和反序列化功能.分享给大家供大家参考,具体如下: 序列化: var s = new Object(); s.Name = "clientValue"; s.Id = 1; s.ClassId = 2; var data = JSON.stringify(s); console.log(data); 反序列化: eval将字符串反序列化成对象 var s = eval('(' + data+ ')'); console.log(s.Name); 完整

  • PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析

    本文实例讲述了PHP中SERIALIZE和JSON的序列化与反序列化操作区别.分享给大家供大家参考,具体如下: PHP中SERIALIZE和JSON序列化与反序列化区别是什么呢,对于这个问题我们可以和小编一起来看看,具体的操作细节如下所示. 在PHP中,serialize和json两种方式对一个对象或数组进行序列化或反序列化有什么区别呢? 假设一个对象和一个数组: $web = new stdClass; $web->site = 'tantengvip'; $web->owner = 'tu

随机推荐