C#中Json序列化的进阶用法
本文所有json序列化,都使用的Newtonsoft.Json包
1 JsonIgnore
在 Newtonsoft.Json 中,如果你不想将某些属性转换为 JSON 字符串,可以使用多种方法来实现。以下是几种常见的方法:
1.1 使用 [JsonIgnore] 特性
[JsonIgnore] 特性可以直接忽略某个属性,使其不会被序列化为 JSON。
using Newtonsoft.Json;public class MyClass
{public int Id { get; set; }public string Name { get; set; }[JsonIgnore]public string Password { get; set; }
}class Program
{static void Main(){var obj = new MyClass { Id = 1, Name = "John", Password = "secret" };string json = JsonConvert.SerializeObject(obj);Console.WriteLine(json);}
}
输出:
{"Id":1,"Name":"John"}
1.2 使用 [JsonProperty] 特性并设置 DefaultValueHandling
你可以使用 [JsonProperty] 特性并设置 DefaultValueHandling 为 Ignore,这样当属性的值为默认值时,它不会被序列化为 JSON。
using Newtonsoft.Json;public class MyClass
{public int Id { get; set; }public string Name { get; set; }[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]public string Password { get; set; }
}class Program
{static void Main(){var obj = new MyClass { Id = 1, Name = "John", Password = null };string json = JsonConvert.SerializeObject(obj);Console.WriteLine(json);}
}
输出:
{"Id":1,"Name":"John"}
2 自定义解析方式
在使用 JsonConvert.DeserializeObject 解析 JSON 数据时,如果某个属性需要以特定的方式进行解析,可以通过自定义 JsonConverter 来实现。JsonConverter 允许你定义如何将 JSON 数据转换为 .NET 对象,或者将 .NET 对象转换为 JSON 数据。
以下是一个示例,展示如何为特定属性创建自定义的 JsonConverter:
2.1 创建自定义的 JsonConverter
假设你有一个类 MyClass,其中有一个属性 MyProperty,你希望以特定的方式解析这个属性:
public class MyClass
{public string MyProperty { get; set; }
}
你可以创建一个自定义的 JsonConverter 来处理 MyProperty:
public class MyPropertyConverter : JsonConverter<string>
{public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer){// 读取 JSON 数据var jsonObject = JObject.Load(reader);// 自定义解析逻辑if (jsonObject["customField"] != null){return jsonObject["customField"].ToString();}return string.Empty;}public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer){// 自定义序列化逻辑writer.WriteValue(value);}
}
2.2 在属性上应用自定义的 JsonConverter
你可以在 MyClass 的 MyProperty 属性上使用 [JsonConverter] 特性来指定自定义的 JsonConverter:
public class MyClass
{[JsonConverter(typeof(MyPropertyConverter))]public string MyProperty { get; set; }
}
2.3 使用 JsonConvert.DeserializeObject 进行解析
现在,当你使用 JsonConvert.DeserializeObject 解析 JSON 数据时,MyProperty 属性将按照你定义的自定义逻辑进行解析:
string json = "{ \"MyProperty\": { \"customField\": \"customValue\" } }";
MyClass myObject = JsonConvert.DeserializeObject<MyClass>(json);Console.WriteLine(myObject.MyProperty); // 输出: customValue
2.4 总结
通过创建自定义的 JsonConverter 并在属性上应用它,你可以灵活地控制 JSON 数据的解析方式。这种方式适用于需要对特定属性进行特殊处理的场景。
3 进阶用法-动态读取,结合反射解析json
一般来说,添加了引用的内容,Newtonsoft.Json都可以直接解析,包括Type
动态读取的dll,如果放在了和执行文件同一目录下也可以正常解析,但是一旦脱离这个目录,json序列化就不行了,找不到对应的内容,尝试了很多方式都不行,结合第二部分,可以使用反射实现。
这种方式有个前提条件,目标dll需要在执行解析之前被读取,这样读取到的资源会保存到AppDomain.CurrentDomain中去,才能进行解析。
Assembly.LoadFrom(dllFile);
/// <summary>
/// 涉及到Type的序列化
/// 并且插件的程序集是程序显式读取的
/// 默认的解析方式读取不到插件对应的dll
/// 需要做自定义解析
/// </summary>
public class TypeJsonConverter : JsonConverter<Type>
{/// <summary>/// 自定义该属性的解析方式/// </summary>public override Type ReadJson(JsonReader reader, Type objectType, Type existingValue, bool hasExistingValue, JsonSerializer serializer){// 自定义解析逻辑if (reader.Value != null){//在调用该程序之前,需要确保插件的dll已经被显式读取,也就是已经存在于主程序集的上下文之中var typeValue = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(plu => plu.AssemblyQualifiedName.Equals(reader.Value)).FirstOrDefault();return typeValue;}return null;}/// <summary>/// 自定义该属性的写入方式/// </summary>public override void WriteJson(JsonWriter writer, Type value, JsonSerializer serializer){// 自定义序列化逻辑writer.WriteValue(value.AssemblyQualifiedName);}
}
然后标记属性
/// <summary>
/// 插件,标记自定义解析方式,否则会解析失败
/// 目前先这样处理
/// </summary>
[JsonConverter(typeof(TypeJsonConverter))]
public Type PluginType { get; set; }
相关文章:
C#中Json序列化的进阶用法
本文所有json序列化,都使用的Newtonsoft.Json包 1 JsonIgnore 在 Newtonsoft.Json 中,如果你不想将某些属性转换为 JSON 字符串,可以使用多种方法来实现。以下是几种常见的方法: 1.1 使用 [JsonIgnore] 特性 [JsonIgnore] 特性…...
IO相关的常用工具包
常用工具包Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包。 作用:提高IO流的开发效率。 使用步骤: 1、在项目中创建一个文件夹:lib 2、将jar包复制粘贴到lib文件夹 3、右键点击jar包,选择Add as Library--->点击OK …...
Spring Boot集成RBloomFilter快速入门Demo
在大数据处理和缓存优化的场景中,布隆过滤器(Bloom Filter)因其高效的空间利用和快速的查询性能而被广泛应用。RBloomFilter是布隆过滤器的一种实现,通常用于判断一个元素是否存在于一个集合中,尽管它存在一定的误判率…...
布局性能优化
布局使用不当回导致卡顿、掉帧、响应慢等问题 一、布局流程 1、应用侧会根据前端UI描述创建后端的页面节点树,其中包含了处理UI组件属性更新、布局测算、事件处理等逻辑 2、页面节点树创建完成后,UI线程会对每个元素进行测算(Measure&#…...
智云人才推荐与管理系统
1.产品介绍 产品名称:智云人才推荐与管理系统 主要功能: 智能人才匹配引擎 功能描述:利用先进的人工智能算法,根据企业岗位需求(如技能要求、工作经验、教育背景等)自动从海量人才库中筛选并推荐最合适的…...
git在远程分支上新建分支
需求: 在远程分支release/test的基础上创建一个新的分支test_20241009 确保本地仓库的信息是最新的 git fetch origin执行了 git fetch,本地仓库已经包含了 origin/release/test 的最新信息。当基于这个远程跟踪分支创建新分支时,会得到一个包…...
用Python实现的高校教师资格考试题库程序
最近朋友参加了高校教师资格考试,在考试前需要刷题来保证通过。但是教资网站上的题库只有接近考试才更新,并且官方题库的刷题效率还是有点低。 👆官方题库的样子 于是想到了是否能够将官方题库内容记录下来,然后自己创建一个高效…...
OpenVINO基本操作流程
环境配置: conda env list:可以查看有哪些环境 conda activate intel:启动某个环境 pip list:可以查看此环境下都下载了哪些软件包 from openvino.inference_engine import IEcore#从OpenVINO推理引擎中导入IECore类 import numpy as np import cv2 1&…...
Spring MVC 注解详解:@RequestBody,@RequestParam 和 @PathVariable
Spring MVC 提供了一系列注解,用于简化请求数据的获取和处理。了解并掌握这些注解的使用,对于开发RESTful API和处理HTTP请求至关重要。本文将详细介绍 RequestBody,RequestParam 和 PathVariable 注解,并附带具体的代码示例&…...
MySQL 8 中的 sql_mode
MySQL 8 中的 sql_mode 设置:提升数据库安全性与性能 在现代数据库管理中,MySQL 是一个广泛使用的开源关系型数据库。随着数据的增长和复杂性增加,良好的数据库配置显得尤为重要。sql_mode 是 MySQL 提供的一个强大功能,它可以帮…...
13种pod的状态
13种pod的状态 生命周期 Pending:Pod被创建后进入调度阶段,k8s调度器依据pod声明的资源请求量和调度规则,为pod挑选一个适合运行的节点。当集群节点不满足pod调度需求时,pod将会处于pending状态。Running:Pod被调度到节点上,k8s将pod调度到节点上后,进入running状态。S…...
2025考研今天开始预报名!攻略请查收
2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程?需要准备哪些信息? 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段: 网上预报名时间为10月9日至10月12日(每日9࿱…...
JS中的Promise经典题目解析
这段代码很有代表性,涵盖了多个 JavaScript 知识点,特别是不同异步操作的执行优先级。 async function async1() {console.log(async1 start);await async2();console.log(async1 end); }async function async2() {console.log(async2); }console.log(s…...
【机器学习】金融预测 —— 风险管理与股市预测
我的主页:2的n次方_ 在金融领域,机器学习(ML)已经成为了不可或缺的工具。金融预测,尤其是风险管理和股市预测,涉及海量数据和复杂模式的分析,而这些正是机器学习擅长处理的领域。通过分析历…...
Bootstrap 5 分页组件使用教程
Bootstrap 5 分页组件使用教程 引言 Bootstrap 5 是一个流行的前端框架,它提供了一套丰富的组件和工具,用于快速开发响应式和移动优先的网页。分页组件是 Bootstrap 5 中用于分割长列表或数据集的重要部分,它可以帮助用户更容易地浏览内容。本文将详细介绍如何在您的项目中…...
Linux 安装 NVM 并配置 npm 加速,开发 node 项目不再愁
由于需要在 linux 机器上完成 node 项目的构建,需要安装 nodejs, 想着不同项目需要使用不同的版本,索性安装一下 nvm 吧,因为之前在 windows 上已经安装过 nvm-windows, 应该很容易上手,我尝试了官网提供的几种方式,最…...
MySQL 多条件查询
在 MySQL 中,多条件查询通常使用 WHERE 子句来指定多个条件。这些条件可以通过逻辑运算符(如 AND、OR、NOT)进行组合,以实现复杂的查询需求。以下是一些常见的多条件查询示例: 使用 AND 运算符 AND 运算符用于组合多…...
深度学习模型
1. 引言 在过去的十年间,深度学习的崛起引发了人工智能领域的革命,深刻影响了多个行业。深度学习是一种模仿人脑神经元的工作方式,通过多层神经网络进行数据处理与特征学习。其应用范围从简单的图像识别到复杂的自然语言处理、自动驾驶和医疗…...
Nexpose 6.6.271 发布下载,新增功能概览
Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…...
SimpleRAG-v1.0.3:增加文件对话功能
Kimi上有一个功能,就是增加文件之后对话,比如我有如下一个私有文档: 会议主题:《如何使用C#提升工作效率》 参会人员:张三、李四、王五 时间:2024.9.26 14:00-16:00 会议内容: 1. 自动化日常任…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
