惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MongoDB | Blog
MongoDB | Blog
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 聂微东
B
Blog RSS Feed
D
Docker
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
V
V2EX
量子位
雷峰网
雷峰网
月光博客
月光博客
云风的 BLOG
云风的 BLOG
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog

博客园 - 华安

自适应网格系统:CSS Grid中repeat()、auto-fill与auto-fit的深度解析 CSS3中响应式布局两大神器display:flex和display:grid springBoot中的 pom.xml文件 bulid学习 CSS中元素的display显示方式有多种,隐藏、块级、内联、内联-块级 SQl Server 中的 go 是什么作用 CSS中 display:flex的align-items: stretch; 移动端浏览器(尤其是 iOS Safari)的橡皮筋回弹效果(Overscroll / Bounce Effect) 手机端浏览器上ES6中的Fetch回调执行 window.open没效果 用Flex实现兼容性好的全屏布局 在 VS Code 中使用 C# Dev Kit 和 Unity Tools 调试 Unity 2022 Unity 可编程物件(ScriptableObject) 微信小程序中的 联系客服 最基本的使用方法 wx.requestSubscribeMessage(Object object) 和 wx.requestSubscribeDeviceMessage(Object object) 这两个有什么区别 微信小程序中 wx.hideLoading() 后调用 wx.showToast()的问题 Windows 中启动 Nginx的常用命令 CSS进阶技巧:字体渐变、描边、倒影与渐变色描边全解析 netCore 中各DLL引用了 SkiaSharp.dll的问题 unity中预制体解包 在 Unity 中,Time.timeScale实现游戏暂停加速等 微信小程序中关联微信支付 unity中的 Navigation AI使用 C#中TaskCompletionSource(简称 TCS)学习 Unity 编辑器 中,快捷键 Ctrl + Shift + F 的功能 unity中按下 F键,让物体聚焦 微信中进入定页面的,判断时通过扫二维码进入的,还是点小程序名称进入的 MYSQL中从JSON字符串中提取指定的值 Unity2022中创建动画 Animation(旧方法) Unity 中区别,public 和 [SerializeField] Unity中 onCollisionEnter2D与OnTriggerEnter2D 区别 asp.netCore中给动态请求路径加客户端缓存
C# 中的操作JSON类 JObject
华安 · 2026-03-13 · via 博客园 - 华安

C# 中的 JObject 是 Newtonsoft.Json(Json.NET)库中的核心类,用于动态操作 JSON 数据。

基础用法

1. 创建 JObject

using Newtonsoft.Json.Linq;

// 方式1:直接创建
JObject obj = new JObject();
obj["name"] = "John";
obj["age"] = 30;

// 方式2:从字符串解析
string json = @"{'name': 'John', 'age': 30}";
JObject obj = JObject.Parse(json);

// 方式3:从对象创建
var person = new { Name = "John", Age = 30 };
JObject obj = JObject.FromObject(person);

2. 读取数据

JObject obj = JObject.Parse(@"{
    'name': 'John',
    'age': 30,
    'address': {
        'city': 'Beijing',
        'zip': '100000'
    },
    'hobbies': ['reading', 'coding']
}");

// 基础访问
string name = (string)obj["name"];           // "John"
int age = (int)obj["age"];                   // 30

// 嵌套对象
string city = (string)obj["address"]["city"]; // "Beijing"

// 数组
JArray hobbies = (JArray)obj["hobbies"];
string firstHobby = (string)hobbies[0];      // "reading"

// 安全访问(防止 null)
string zip = obj["address"]?["zip"]?.Value<string>(); // "100000"

3. 修改数据

JObject obj = JObject.Parse(@"{'name': 'John', 'age': 30}");

// 修改
obj["age"] = 31;

// 添加新字段
obj["email"] = "john@example.com";

// 添加嵌套对象
obj["profile"] = new JObject
{
    ["avatar"] = "http://example.com/avatar.jpg",
    ["level"] = 5
};

// 添加数组
obj["tags"] = new JArray("vip", "active");

// 删除字段
obj.Remove("age");

// 输出 JSON
string json = obj.ToString();
// 或压缩格式
string compact = obj.ToString(Newtonsoft.Json.Formatting.None);

高级操作

LINQ 查询

string json = @"{
    'stores': [
        { 'name': 'Store A', 'products': [
            { 'name': 'Apple', 'price': 5 },
            { 'name': 'Banana', 'price': 3 }
        ]},
        { 'name': 'Store B', 'products': [
            { 'name': 'Orange', 'price': 4 }
        ]}
    ]
}";

JObject data = JObject.Parse(json);

// 查询所有产品价格大于3的产品
var expensiveProducts = data["stores"]
    .SelectMany(s => s["products"])
    .Where(p => (decimal)p["price"] > 3)
    .Select(p => new 
    { 
        Name = (string)p["name"], 
        Price = (decimal)p["price"] 
    });

foreach (var product in expensiveProducts)
{
    Console.WriteLine($"{product.Name}: {product.Price}");
}

合并 JObject

JObject obj1 = JObject.Parse(@"{'a': 1, 'b': 2}");
JObject obj2 = JObject.Parse(@"{'b': 3, 'c': 4}");

// 合并(obj2 覆盖 obj1 的相同键)
obj1.Merge(obj2, new JsonMergeSettings
{
    MergeArrayHandling = MergeArrayHandling.Union
});
// 结果: {'a': 1, 'b': 3, 'c': 4}

深克隆

JObject original = JObject.Parse(@"{'name': 'John'}");
JObject clone = (JObject)original.DeepClone();

clone["name"] = "Jane";
// original["name"] 仍然是 "John"

动态类型访问

dynamic obj = JObject.Parse(@"{'name': 'John', 'age': 30}");

string name = obj.name;    // "John"
int age = obj.age;         // 30

// 甚至可以动态添加
obj.email = "john@example.com";

与实体类转换

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

// JObject -> 实体类
JObject jsonObj = JObject.Parse(@"{'name': 'John', 'age': 30}");
Person person = jsonObj.ToObject<Person>();

// 实体类 -> JObject
Person p = new Person { Name = "Jane", Age = 25 };
JObject backToJson = JObject.FromObject(p);

JObject.SelectToken使用

using Newtonsoft.Json.Linq;

class Program
{
    static void Main()
    {
        string json = @"{
            'store': {
                'book': [
                    { 'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95 },
                    { 'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99 },
                    { 'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'price': 8.99 }
                ],
                'bicycle': { 'color': 'red', 'price': 19.95 }
            },
            'expensive': 10
        }";

        JObject obj = JObject.Parse(json);

        // 1. 获取所有书的作者
        Console.WriteLine("所有作者:");
        foreach (var author in obj.SelectTokens("$.store.book[*].author"))
        {
            Console.WriteLine($"  {author}");
        }

        // 2. 获取价格小于10的书
        Console.WriteLine("\n便宜的书 (<10):");
        foreach (var book in obj.SelectTokens("$.store.book[?(@.price < 10)]"))
        {
            Console.WriteLine($"  {book["title"]}: {book["price"]}");
        }

        // 3. 获取最后一本书
        var lastBook = obj.SelectToken("$.store.book[-1:]");
        Console.WriteLine($"\n最后一本书: {lastBook["title"]}");

        // 4. 获取所有价格(递归)
        Console.WriteLine("\n所有价格:");
        foreach (var price in obj.SelectTokens("$..price"))
        {
            Console.WriteLine($"  {price}");
        }

        // 5. 获取 fiction 类别的书
        Console.WriteLine("\n小说类:");
        foreach (var book in obj.SelectTokens("$.store.book[?(@.category == 'fiction')]"))
        {
            Console.WriteLine($"  {book["title"]}");
        }
    }
}

性能优化建议

1773384066056

与 System.Text.Json 对比

1773384094936

 .NET 6+ 推荐使用 System.Text.JsonJsonNode 作为替代:

// System.Text.Json 方式
using System.Text.Json.Nodes;

JsonNode node = JsonNode.Parse(@"{'name': 'John'}");
node["age"] = 30;