c# Newtonsoft.Json 使用 LINQ 查询 JSON 数据

在 C# 中,Newtonsoft.Json 提供了与 LINQ(Language Integrated Query)结合使用的强大功能,可以轻松地查询、过滤和操作 JSON 数据。通过使用 JObjectJArray,你可以通过 LINQ 查询 JSON 对象和数组。

1. 基本的 LINQ 查询 JSON 数据

假设有以下 JSON 数据:

{
  "people": [
    { "name": "Alvin", "age": 30, "gender": "male" },
    { "name": "Tom", "age": 25, "gender": "male" },
    { "name": "Lisa", "age": 28, "gender": "female" }
  ]
}

你可以使用 LINQ 进行查询。例如,要筛选出所有年龄大于 25 的人,可以这样做:

using Newtonsoft.Json.Linq;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string json = @"{
            'people': [
                { 'name': 'Alvin', 'age': 30, 'gender': 'male' },
                { 'name': 'Tom', 'age': 25, 'gender': 'male' },
                { 'name': 'Lisa', 'age': 28, 'gender': 'female' }
            ]
        }";

        // 解析 JSON 字符串为 JObject
        JObject jsonObject = JObject.Parse(json);

        // 获取 "people" 数组
        JArray people = (JArray)jsonObject["people"];

        // 使用 LINQ 查询年龄大于 25 的人
        var query = from p in people
                    where (int)p["age"] > 25
                    select p;

        // 输出结果
        foreach (var person in query)
        {
            Console.WriteLine(person["name"] + " - " + person["age"]);
        }
    }
}
输出:
Alvin - 30
Lisa - 28

2. 筛选并返回某些字段

你还可以使用 LINQ 来选择特定字段。假设你只想获取所有女性的姓名和年龄:

var femaleQuery = from p in people
                  where (string)p["gender"] == "female"
                  select new
                  {
                      Name = (string)p["name"],
                      Age = (int)p["age"]
                  };

foreach (var person in femaleQuery)
{
    Console.WriteLine(person.Name + " - " + person.Age);
}
输出:
Lisa - 28

3. 复杂的条件查询

你可以通过组合多个条件来实现更复杂的查询。例如,要查询所有男性且年龄大于 25 的人:

var complexQuery = from p in people
                   where (string)p["gender"] == "male" && (int)p["age"] > 25
                   select p;

foreach (var person in complexQuery)
{
    Console.WriteLine(person["name"] + " - " + person["age"]);
}
输出:
Alvin - 30

4. 使用 JToken 的 LINQ 查询

Newtonsoft.Json.Linq.JTokenJObjectJArray 的基类,你也可以直接对 JToken 使用 LINQ 查询。

例如,要查找 JSON 对象中的所有名字:

var names = jsonObject["people"]
            .Children<JObject>()
            .Select(p => (string)p["name"]);

foreach (var name in names)
{
    Console.WriteLine(name);
}
输出:
Alvin
Tom
Lisa

5. 处理嵌套 JSON 数据

如果 JSON 数据有更复杂的嵌套结构,你同样可以通过 LINQ 来访问嵌套数据。

例如,假设我们有如下的嵌套 JSON 数据:

{
  "company": {
    "employees": [
      { "name": "Alvin", "address": { "city": "Shanghai", "street": "Main St" } },
      { "name": "Tom", "address": { "city": "Beijing", "street": "1st Ave" } }
    ]
  }
}

使用 LINQ 查询所有员工的姓名及其所在的城市:

string nestedJson = @"{
    'company': {
        'employees': [
            { 'name': 'Alvin', 'address': { 'city': 'Shanghai', 'street': 'Main St' } },
            { 'name': 'Tom', 'address': { 'city': 'Beijing', 'street': '1st Ave' } }
        ]
    }
}";

// 解析 JSON 字符串为 JObject
JObject nestedObject = JObject.Parse(nestedJson);

// 使用 LINQ 查询嵌套的 JSON 数据
var employeeQuery = from e in nestedObject["company"]["employees"]
                    select new
                    {
                        Name = (string)e["name"],
                        City = (string)e["address"]["city"]
                    };

foreach (var employee in employeeQuery)
{
    Console.WriteLine($"{employee.Name} lives in {employee.City}");
}
输出:
Alvin lives in Shanghai
Tom lives in Beijing

6. 将 LINQ 查询结果转换为新的 JSON

你可以将查询结果转换为一个新的 JSON 对象。例如,筛选出年龄大于 25 的人,并创建一个新的 JSON 数组:

var filteredPeople = new JArray(
    from p in people
    where (int)p["age"] > 25
    select new JObject
    {
        { "name", p["name"] },
        { "age", p["age"] }
    }
);

Console.WriteLine(filteredPeople.ToString());
输出:
[
  {
    "name": "Alvin",
    "age": 30
  },
  {
    "name": "Lisa",
    "age": 28
  }
]

总结

  • 通过将 JObjectJArray 与 LINQ 相结合,能够方便地对 JSON 数据进行查询和筛选。
  • LINQ 允许你使用类似 SQL 的查询语法来操作 JSON 数据,支持复杂条件、嵌套数据和选择特定字段的操作。
  • 查询结果可以直接转换为新的 JSON 对象或数组,便于后续操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命不息-学无止境

你的每一份支持都是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值