【C#笔记】Newtonsoft.Json 中 `[JsonIgnore]` 的作用详解

【C#笔记】Newtonsoft.Json 中 [JsonIgnore] 的作用详解

在使用 Newtonsoft.Json(Json.NET 进行对象序列化和反序列化时,我们经常会遇到这样一种需求:

有些属性我们希望 只在程序内部使用 ,而 不想被输出到 JSON 文件中

此时,一个简单的特性(Attribute)就能帮我们轻松搞定------那就是 [JsonIgnore]


一、[JsonIgnore] 是什么?

[JsonIgnore] 是 Newtonsoft.Json 提供的一个特性,用于在 JSON 序列化和反序列化过程中忽略指定属性或字段

简而言之:

  • 序列化 时,它不会被写入到 JSON 字符串中;
  • 反序列化 时,即使 JSON 里包含该字段,也不会赋值给对象。

二、基本示例

来看一个简单的例子 👇

csharp 复制代码
using Newtonsoft.Json;

public class Person
{
    public string Name { get; set; }

    [JsonIgnore]
    public int Age { get; set; }

    public string City { get; set; }
}

var person = new Person
{
    Name = "Alice",
    Age = 30,
    City = "Shanghai"
};

string json = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(json);

输出结果如下:

json 复制代码
{
  "Name": "Alice",
  "City": "Shanghai"
}

你会发现,Age 字段并没有出现在结果中,因为它被 [JsonIgnore] 忽略了。


三、反序列化时的行为

[JsonIgnore] 不仅会影响序列化,也会影响反序列化。

csharp 复制代码
string json = @"{ ""Name"": ""Alice"", ""Age"": 30, ""City"": ""Shanghai"" }";

var person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.Age); // 输出:0

即使 JSON 中有 "Age": 30

反序列化后的 person.Age 仍然是默认值 0

因为 [JsonIgnore] 告诉 Json.NET 不要理会这个字段。


四、典型使用场景

[JsonIgnore] 的用途非常广泛,以下是一些常见场景:

  1. 隐藏敏感信息

    csharp 复制代码
    [JsonIgnore]
    public string Password { get; set; }

    防止密码、Token 等被写入 JSON 文件或日志。

  2. 避免循环引用

    csharp 复制代码
    public class Node
    {
        public string Name { get; set; }
        [JsonIgnore]
        public Node Parent { get; set; }
    }

    否则可能出现无限递归,导致序列化失败。

  3. 排除运行时属性

    某些属性只在内存中使用,不需要被保存或传输。


五、与其他 Json 特性的区别

特性 作用
[JsonIgnore] 忽略序列化与反序列化
[JsonProperty("CustomName")] 改变 JSON 字段名
[JsonRequired] 要求反序列化时必须存在该字段,否则报错
[JsonConverter(typeof(...))] 使用自定义转换器处理字段
[JsonExtensionData] 存放未知或额外的 JSON 字段

可以看到,[JsonIgnore] 是最简单直接的控制手段。


六、进阶:仅在特定情况下忽略

有时我们希望更灵活地控制,比如只忽略"空值"或"序列化时才忽略"。

Newtonsoft.Json 还提供了更细粒度的设置方式:

csharp 复制代码
JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore
});

或者:

csharp 复制代码
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Address { get; set; }

不过,如果你只是想彻底排除一个字段,[JsonIgnore] 是最直接、最推荐的方式。


七、总结

关键点 说明
特性名称 [JsonIgnore]
所属库 Newtonsoft.Json
作用 忽略属性的序列化和反序列化
典型场景 隐藏敏感字段、避免循环引用、跳过临时变量
替代方案 JsonSerializerSettingsJsonProperty

一句话总结:

当你不想让某个属性出现在 JSON 中时,加上 [JsonIgnore],它就会"消失得无影无踪"。


相关推荐
tiger从容淡定是人生4 分钟前
AI替代软件战略(一):从 CCleaner 到 MCP 架构重构 —— TigerCleaner 的工程实践
人工智能·重构·架构·c#·mcp
做cv的小昊5 分钟前
【TJU】研究生应用统计学课程笔记(6)——第二章 参数估计(2.4 区间估计)
人工智能·笔记·线性代数·算法·机器学习·数学建模·概率论
学机械的鱼鱼26 分钟前
【学习笔记】QGroundControl安装与使用简明指南
笔记·学习
zhangrelay28 分钟前
Ubuntu 18.04 经典 / 有趣 / 实用 APT 软件清单
linux·笔记·学习·ubuntu
许长安1 小时前
protobuf 使用详解
c++·经验分享·笔记·中间件
资深流水灯工程师1 小时前
UART 通讯DMA+IDLE模式笔记
笔记·单片机·嵌入式硬件
hello_读书就是赚钱1 小时前
提示词工程学习笔记
笔记·学习
二哈赛车手2 小时前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
Brilliantwxx2 小时前
【C++】String的模拟实现(代码实现与坑点讲解)
开发语言·c++·笔记·算法
zhangrelay2 小时前
ROS Kinetic-信号与系统-趣味案例
linux·笔记·学习·ubuntu