【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] 的用途非常广泛,以下是一些常见场景:
-
隐藏敏感信息
csharp[JsonIgnore] public string Password { get; set; }防止密码、Token 等被写入 JSON 文件或日志。
-
避免循环引用
csharppublic class Node { public string Name { get; set; } [JsonIgnore] public Node Parent { get; set; } }否则可能出现无限递归,导致序列化失败。
-
排除运行时属性
某些属性只在内存中使用,不需要被保存或传输。
五、与其他 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 |
| 作用 | 忽略属性的序列化和反序列化 |
| 典型场景 | 隐藏敏感字段、避免循环引用、跳过临时变量 |
| 替代方案 | JsonSerializerSettings、JsonProperty 等 |
✅ 一句话总结:
当你不想让某个属性出现在 JSON 中时,加上
[JsonIgnore],它就会"消失得无影无踪"。