Newtonsoft.Json(Json.NET)核心概念与高级用法笔记
一、JSON 解析的核心过程
当我们调用:
JObject obj = JObject.Parse(jsonString);
Json.NET 会执行以下过程:
- 解析 JSON 文本字符串(如
"{ "name": "Yty", "info": { "age": 25 } }"
); - 构建一棵 JSON 对象树(DOM);
- 树中每个节点都用特定的类(
JObject
、JProperty
、JValue
等)来表示; - 这些对象彼此通过父子关系相连,形成层级化的结构,方便访问、修改和查询。
🧱 示例结构映射:
{"user": {"name": "Yty","info": { "age": 25 }}
}
会被解析成:
JObject (根)
└── JProperty("user")└── JObject├── JProperty("name") → JValue("Yty")└── JProperty("info")└── JObject└── JProperty("age") → JValue(25)
在代码中:
JObject root = JObject.Parse(json);
JObject user = (JObject)root["user"];
Console.WriteLine(user["name"]); // "Yty"
✅ 每个
{ ... }
对应一个 JObject;
每个"key": value
对应一个 JProperty;
每个最终的值(字符串、数字、布尔)是一个 JValue。
二、核心类型结构
JToken // 所有 JSON 节点的抽象基类├── JValue // 原子值(string、int、bool、null 等)├── JContainer // 可包含子节点的容器│ ├── JObject // 对象 { ... },由多个 JProperty 组成│ ├── JArray // 数组 [ ... ]│ └── JConstructor // 少用└── JProperty // 键值对 "key": value
层次逻辑:
- JObject → 多个 JProperty;
- JProperty → Name + Value;
- Value 仍是一个 JToken(可能是 JObject / JArray / JValue)。
三、JObject 遍历与访问
1️⃣ 遍历属性
foreach (JProperty prop in obj.Properties())Console.WriteLine($"{prop.Name}: {prop.Value}");
2️⃣ 像字典一样遍历
foreach (var kv in obj)Console.WriteLine($"{kv.Key}: {kv.Value}");
3️⃣ 递归遍历嵌套对象
void Traverse(JObject o)
{foreach (var p in o.Properties()){if (p.Value.Type == JTokenType.Object)Traverse((JObject)p.Value);elseConsole.WriteLine($"{p.Name}: {p.Value}");}
}
四、JToken 的多态特性
JToken
是所有节点的基类。
使用 JToken
参数可以编写能处理任意 JSON 节点类型的通用方法:
void Print(JToken token)
{switch (token.Type){case JTokenType.Object:foreach (var p in ((JObject)token).Properties())Print(p);break;case JTokenType.Property:var prop = (JProperty)token;Console.WriteLine($"{prop.Name}:");Print(prop.Value);break;case JTokenType.Array:foreach (var item in (JArray)token)Print(item);break;default:Console.WriteLine(token.ToString());break;}
}
💡 通过多态,
Print()
可递归处理任意 JSON 节点(对象、数组、值)。
五、嵌套对象关系与代码对应
JSON 片段 | 对应对象类型 | C# 表达式示例 |
---|---|---|
{ ... } |
JObject | var o = JObject.Parse(json) |
"key": value |
JProperty | o.Properties() |
"name": "Yty" |
JProperty + JValue | prop.Value |
"info": { "age": 25 } |
JProperty + JObject | (JObject)prop.Value |
25 |
JValue | (int)prop.Value |
六、常用高级技巧
功能 | 方法 | 示例 |
---|---|---|
解析 JSON | JObject.Parse(json) |
创建 JObject |
路径访问 | SelectToken("$.user.info.age") |
支持 JSONPath |
动态访问 | dynamic person = JObject.Parse(...); person.name |
简洁 |
合并对象 | obj1.Merge(obj2) |
合并两个 JObject |
判断类型 | token.Type == JTokenType.Object |
类型判断 |
修改值 | prop.Value = new JValue(123) |
动态修改 |
七、一句话总结
- JSON 文本解析后被表示为一棵 JToken 树;
- 每个
{}
是一个 JObject,每个"key": value
是一个 JProperty;- 值部分(
value
)可再是 JObject、JArray 或 JValue;JToken
作为统一父类,使方法能对所有节点类型多态处理。- 嵌套 JSON 结构就是 JObject 套 JObject。