在 C# 中,Newtonsoft.Json
提供了与 LINQ(Language Integrated Query)结合使用的强大功能,可以轻松地查询、过滤和操作 JSON 数据。通过使用 JObject
和 JArray
,你可以通过 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.JToken
是 JObject
和 JArray
的基类,你也可以直接对 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
}
]
总结
- 通过将
JObject
和JArray
与 LINQ 相结合,能够方便地对 JSON 数据进行查询和筛选。 - LINQ 允许你使用类似 SQL 的查询语法来操作 JSON 数据,支持复杂条件、嵌套数据和选择特定字段的操作。
- 查询结果可以直接转换为新的 JSON 对象或数组,便于后续操作。