笔记:Newtonsoft.Json 自定义序列化反序列化规则

使用 Newtonsoft.Json,你可以在类内部自定义序列化和反序列化规则。这通常通过实现 JsonConverter 抽象类来完成。自定义转换器允许你控制类的序列化和反序列化行为,使你能够处理复杂的场景,比如序列化第三方库的对象,或者处理不支持默认序列化过程的类型。

实现自定义转换器

下面是一个简单的示例,展示如何为一个特定的类创建自定义转换器:

1. 定义类和自定义转换器

假设我们有一个 Event 类,其中包含日期和事件描述。我们想要在序列化时仅包含日期的年份和事件描述。

cs 复制代码
public class Event
{
    public DateTime Date { get; set; }
    public string Description { get; set; }
}

public class EventConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Event);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 反序列化逻辑
        JObject obj = JObject.Load(reader);
        var eventObj = new Event
        {
            Description = obj["Description"].Value<string>(),
            Date = new DateTime(obj["Year"].Value<int>(), 1, 1)
        };
        return eventObj;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 序列化逻辑
        var eventObj = (Event)value;
        JObject obj = new JObject
        {
            ["Year"] = eventObj.Date.Year,
            ["Description"] = eventObj.Description
        };
        obj.WriteTo(writer);
    }
}

2. 使用自定义转换器

在序列化和反序列化 Event 类的实例时,指定 EventConverter 作为转换器:

cs 复制代码
Event myEvent = new Event
{
    Date = new DateTime(2023, 4, 1),
    Description = "An important event."
};

// 序列化
string json = JsonConvert.SerializeObject(myEvent, new EventConverter());
Console.WriteLine(json);

// 反序列化
Event deserializedEvent = JsonConvert.DeserializeObject<Event>(json, new EventConverter());
Console.WriteLine($"{deserializedEvent.Description} on {deserializedEvent.Date}");

3. 为类添加 JsonConverter 特性

然后,我们在 Event 类上添加 JsonConverter 特性,指定 EventConverter 作为其转换器。

cs 复制代码
[JsonConverter(typeof(EventConverter))]
public class Event
{
    public DateTime Date { get; set; }
    public string Description { get; set; }
}

在 Newtonsoft.Json 中,你可以通过在类上添加 JsonConverter 特性(attribute)来定义全局转换器,这样就为特定的类指定了一个自定义的序列化和反序列化转换器。这意味着每当这个类被序列化或反序列化时,Newtonsoft.Json 都会使用你指定的转换器,而不是默认的序列化行为。

注意事项

• 自定义转换器非常强大,但它们也增加了代码的复杂性。在创建自定义转换器之前,考虑是否有更简单的方法可以满足需求。

• 当使用自定义转换器时,确保在序列化和反序列化过程中都指定了它,否则 Newtonsoft.Json 将使用默认的序列化行为。

• 在自定义转换器的 ReadJson 和 WriteJson 方法中,确保处理可能的异常和边缘情况,以避免运行时错误。

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

相关推荐
Wanderer X1 小时前
MiniMax-H3(ref2va)架构与推理方法笔记
笔记
深圳老胡1 小时前
STM32C562RET6 外部中断详解:从 EXTI 原理到 GPIO 外部中断实战
笔记·stm32·单片机·代码规范·1024程序员节
海绵宝宝转agent1 小时前
leetcodehot100个人题解
java·笔记·学习·算法
李某学编程15 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
sbjdhjd17 小时前
AI产业周度动态:从“更强模型”走向“可执行、可治理、可计价”的系统竞争 (2026年10月19日—10月25日)
人工智能·笔记·ai·开源·gemini·信息差·claude code
ss27318 小时前
AI时代首先数据库-PostgreSQL实战笔记 27 PostgreSQL数据写入与读取流程解析
数据库·笔记·postgresql
深圳老胡18 小时前
压力检测空吸功能硬件方案全解析:主流压力传感器品牌与实现路径
笔记·单片机·代码规范
程序猿追19 小时前
返回 null 不一定入队成功:鸿蒙 KMP上的并发优先队列观察笔记
笔记·华为·harmonyos·kmp
崔高杰19 小时前
【多论文阅读笔记】下一阶段,Agent记忆关注什么能力?
论文阅读·笔记
ms72wx20 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker