Newtonsoft.Json笔记 -JToken、JObject、JArray详解

Newtonsoft.Json(Json.NET)核心概念与高级用法笔记

一、JSON 解析的核心过程

当我们调用:

JObject obj = JObject.Parse(jsonString);

Json.NET 会执行以下过程:

  1. 解析 JSON 文本字符串(如 "{ "name": "Yty", "info": { "age": 25 } }");
  2. 构建一棵 JSON 对象树(DOM)
  3. 树中每个节点都用特定的类(JObjectJPropertyJValue 等)来表示;
  4. 这些对象彼此通过父子关系相连,形成层级化的结构,方便访问、修改和查询。

🧱 示例结构映射:

{
  "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);
        else
            Console.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)可再是 JObjectJArrayJValue
  • JToken 作为统一父类,使方法能对所有节点类型多态处理。
  • 嵌套 JSON 结构就是 JObject 套 JObject
posted @ 2025-10-20 14:48  Ytytyty  阅读(67)  评论(0)    收藏  举报