当前位置: 首页 > news >正文

笔记:Newtonsoft.Json 自定义一个根据typeconverter转换的JsonConverter

        在 Newtonsoft.Json 中创建一个根据 TypeConverter 转换的 JsonConverter 允许你在序列化和反序列化过程中利用 .NET 的 TypeConverter 机制。这种方式特别有用,当你想要为不直接支持 JSON 序列化的类型提供自定义的序列化逻辑时,比如第三方库中的类型或者特殊的数据结构。
下面是一个示例,展示如何实现这样一个 JsonConverter:


1.    定义 TypeConverterJsonConverter 类


这个自定义的 JsonConverter 将检查目标类型是否有一个 TypeConverter,该 TypeConverter 能够将对象转换为字符串,反之亦然。如果有,它将使用这个 TypeConverter 来进行序列化和反序列化。

public class TypeConverterJsonConverter : JsonConverter
{public override bool CanConvert(Type objectType){// 检查是否存在能够转换到字符串和从字符串转换回来的 TypeConverterTypeConverter converter = TypeDescriptor.GetConverter(objectType);return converter != null && converter.CanConvertFrom(typeof(string)) && converter.CanConvertTo(typeof(string));}public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){if (reader.TokenType == JsonToken.Null){return null;}var converter = TypeDescriptor.GetConverter(objectType);return converter.ConvertFromInvariantString((string)reader.Value);}public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){if (value == null){writer.WriteNull();return;}var converter = TypeDescriptor.GetConverter(value.GetType());writer.WriteValue(converter.ConvertToInvariantString(value));}

2.    使用 TypeConverterJsonConverter


现在,你可以在序列化和反序列化时使用这个自定义的 JsonConverter。这对于那些通过 TypeConverter 可以转换为字符串和从字符串转换回来的类型特别有用。

[JsonConverter(typeof(TypeConverterJsonConverter))]
public class CustomType
{// 假设这个类有一个能够转换为字符串和从字符串转换回来的 TypeConverter
}// 现在,你可以序列化和反序列化包含 CustomType 类型的对象了
CustomType myObject = new CustomType();
string json = JsonConvert.SerializeObject(myObject);CustomType deserializedObject = JsonConvert.DeserializeObject<CustomType>(json);

注意事项


•    这个自定义 JsonConverter 假设目标类型有一个有效的 TypeConverter,能够进行到字符串和从字符串的转换。不是所有的类型都有这样的 TypeConverter,所以在使用之前请确保进行了适当的检查。
•    使用 TypeConverter 进行序列化和反序列化可能不适用于所有场景,特别是当类型的字符串表示不足以完全恢复对象状态时。在这些情况下,考虑实现更具体的序列化逻辑。
•    这种方法的优点是它提供了一种灵活的方式来支持额外的类型,而无需为每种类型编写专门的序列化逻辑。 

System.Windows.Controls 命名空间 | Microsoft Learn

相关文章:

笔记:Newtonsoft.Json 自定义一个根据typeconverter转换的JsonConverter

在 Newtonsoft.Json 中创建一个根据 TypeConverter 转换的 JsonConverter 允许你在序列化和反序列化过程中利用 .NET 的 TypeConverter 机制。这种方式特别有用&#xff0c;当你想要为不直接支持 JSON 序列化的类型提供自定义的序列化逻辑时&#xff0c;比如第三方库中的类型或…...

第241题| 确定极限中参数问题 | 武忠祥老师每日一题

解题思路&#xff1a;确定极限中的参数的方法是求这个极限&#xff1b;求极限根据类型选方法。 形可以用到三种方法&#xff1a;洛必达&#xff0c;等价&#xff0c;泰勒。 先观察题目&#xff0c;将看成一个整体&#xff0c;同时,并令,整理之后如下&#xff1a; 这里也要想办…...

线程池【开发实践】

文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用&#xff08;优点&#xff09;1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略&#xff08;可自定…...

论文辅助笔记:ST-LLM

1 时间嵌入 2 PFA&#xff08;Partial Frozen Architecture&#xff09; 3 ST_LLM 3.1 初始化 3.2 forward...

加入运动健康数据开放平台,共赢鸿蒙未来

HarmonyOS SDK运动健康服务&#xff08;Health Service Kit&#xff09;是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台。在获取用户授权后&#xff0c;开发者可以使用运动健康服务提供的开放能力获取运动健康数据&#xff0c;基于多种类型数据构建运动健…...

企业化运维(7)_Zabbix企业级监控平台

官网&#xff1a;Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution ###1.Zabbix部署### &#xff08;1&#xff09;zabbix安装 安装源 修改安装路径为清华镜像 [rootserver1 zabbix]# cd /etc/yum.repos.d/ [rootserver1 yum.repos.d]# vim zabbix.r…...

CTF php RCE (一)

0x01 引言 首先进入题目 应该是大部分都是一段白盒PHP审计&#xff0c;然后我们为了命令执行&#xff0c;绕过或者是钻空子等等操作&#xff0c;来拿到flag 0x02 基础 0x01 传参方式 这里有两个工具&#xff0c;hackbar和burpsuite,这两个工具非常实用 大家可以自己Googl…...

Proteus + Keil单片机仿真教程(五)多位LED数码管的静态显示

Proteus + Keil单片机仿真教程(五)多位LED数码管 上一章节讲解了单个数码管的静态和动态显示,这一章节将对多个数码管的静态显示进行学习,本章节主要难点: 1.锁存器的理解和使用; 2.多个数码管的接线封装方式; 3.Proteus 快速接头的使用。 第一个多位数码管示例 元件…...

【Linux】网络新兵连

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在上一篇博客中&#xff0c;我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容&#xff0c;那么我们开始吧&#xff01; 1.网络中的地址管理 大家一…...

基于STM32的智能加湿器

1.简介 基于STM32的加湿器发展前景非常乐观&#xff0c;这主要得益于其在技术、市场需求、应用场景以及政策支持等多方面的优势。STM32微控制器具备强大的处理能力和丰富的外设接口&#xff0c;能够实现精确的湿度监测和智能化控制。基于STM32的加湿器可以根据环境湿度自动调节…...

ubuntu 如何解压tar

在Ubuntu中解压.tar文件&#xff0c;可以使用tar命令。以下是解压.tar文件的命令&#xff1a; tar -xvf file.tar 解释&#xff1a; x 表示解压 v 表示显示过程中的详细信息&#xff08;可选&#xff09; f 表示后面跟文件名 这将在当前目录下解压file.tar文件的内容。如果…...

C++ 算法——二分查找

如果要你在一个升序序列中查找一个值的位置&#xff0c;你是否还会傻乎乎的用下面这个 O ( n ) \mathcal O(n) O(n) 的代码暴力查找&#xff0c;如果是&#xff0c;我告诉你&#xff0c;其实根本不用这么做。 int find(int a[],int n,int k) {for(int i0;i<n;i) if(a[i]k)…...

【自动驾驶仿真在做什么——初学者总结(陆续补充)】

文章目录 基础概念自动驾驶级别再稍提一下ODD是什么&#xff1f; 自动驾驶仿真分类软件在环仿真硬件仿真 仿真究竟难在哪&#xff1f;关于lidar和radar区别一些名词解释 最近也是学习自动驾驶仿真相关知识&#xff0c;习惯去总结一下&#xff0c;方便自己回顾和总结&#xff0c…...

探索HTML5的设计原则:引领Web开发的未来方向

随着互联网的飞速发展&#xff0c;HTML5作为Web技术的核心标准之一&#xff0c;不仅极大地丰富了网页的表现力和交互性&#xff0c;还推动了Web应用向更加动态、高效、安全的方向迈进。HTML5的设计原则&#xff0c;体现了对用户体验、内容可访问性、跨平台兼容性以及未来可扩展…...

力扣喜刷刷--day1

1.无重复字符的最长子串 知识点&#xff1a;滑动窗口 基本概念 窗口&#xff1a;窗口是一个连续的子序列&#xff0c;可以是固定长度或可变长度。滑动&#xff1a;窗口在数据序列上移动&#xff0c;可以是向左或向右。边界&#xff1a;窗口的起始和结束位置。 应用场景 字符…...

配置linux的yum镜像为阿里镜像源

1.备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base.repo 到/etc/yum.repos.d wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3.清空并生成缓存 yum clean …...

react使用markdown进行展示

有一些文档非常长&#xff0c;但是又要挨个设置样式&#xff0c;直接用 组件库 - marked 注意文档要放在public下才能读取。但非常方便 import { marked, Renderer } from "marked".....const [html, setHtml] useState<any>("")const renderer:…...

实时温湿度监测系统:Micropython编码ESP32与DHT22模块的无线数据传输与PC端接收项目

实时温湿度监测系统 前言项目目的项目材料项目步骤模拟ESP32接线连接测试搭建PC端ESP32拷录环境对ESP32进行拷录PC端搭建桌面组件本地数据接收桌面小组件部分 实验总结 前言 人生苦短&#xff0c;我用Python。 由于我在日常工作中经常使用Python&#xff0c;因此在进行该项目…...

CloudWatch Logs Insights 详解

CloudWatch Logs Insights 是 AWS 提供的强大日志分析工具,允许您快速、交互式地搜索和分析日志数据。本文将详细介绍使用 CloudWatch Logs Insights 所需的权限、常用查询方法,以及一些实用的查询示例。 1. 所需权限 要使用 CloudWatch Logs Insights,用户需要具备以下 I…...

Jmeter在信息头中设置Bearer与 token 的拼接值

思路&#xff1a;先获取token&#xff0c;将token设置成全局变量&#xff0c;再与Bearer拼接。 第一步&#xff1a;使用提取器将token值提取出来&#xff0c;使用setProperty函数将提取的token值设置成全局变量&#xff0c;在登录请求后面添加BeanShell取样器 或者 BeanShell后…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...