当前位置: 首页 > 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

http://www.lryc.cn/news/395909.html

相关文章:

  • 第241题| 确定极限中参数问题 | 武忠祥老师每日一题
  • 线程池【开发实践】
  • 论文辅助笔记:ST-LLM
  • 加入运动健康数据开放平台,共赢鸿蒙未来
  • 企业化运维(7)_Zabbix企业级监控平台
  • CTF php RCE (一)
  • Proteus + Keil单片机仿真教程(五)多位LED数码管的静态显示
  • 【Linux】网络新兵连
  • 基于STM32的智能加湿器
  • ubuntu 如何解压tar
  • C++ 算法——二分查找
  • 【自动驾驶仿真在做什么——初学者总结(陆续补充)】
  • 探索HTML5的设计原则:引领Web开发的未来方向
  • 力扣喜刷刷--day1
  • 配置linux的yum镜像为阿里镜像源
  • react使用markdown进行展示
  • 实时温湿度监测系统:Micropython编码ESP32与DHT22模块的无线数据传输与PC端接收项目
  • CloudWatch Logs Insights 详解
  • Jmeter在信息头中设置Bearer与 token 的拼接值
  • C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
  • 数据统计与数据分组18-25题(30 天 Pandas 挑战)
  • Apache Seata应用侧启动过程剖析——注册中心与配置中心模块
  • 大话光学原理:1.“实体泛光说”、反射与折射
  • 住宅代理、移动代理和数据中心代理之间的区别
  • 光学传感器图像处理流程(一)
  • el-table 树状表格查询符合条件的数据
  • MQTT教程--服务器使用EMQX和客户端使用MQTTX
  • 326. 3 的幂
  • 多标签问题
  • suricata7 rule加载(三)加载options