C#中反序列化一个JSON文件,往往需要先创建一个结构相同的类,这也是很多人和官方推荐的,但有时候只需要JSON中的一小部分信息,专门创建一个类很折腾。
这是官方的用法:如何将 JSON 读取为 .NET 对象(反序列化)
如果不想用.net类进行反序列化,根据本人经验,有2个办法:
-
使用 Visual Studio 2022 自动生成所需的类(还是用了类,但比较方便,亲测有效)
1)复制需要反序列化的 JSON。
2)创建一个类文件并删除模板代码。
3)选择编辑>选择性粘贴>将 JSON 粘贴为类。 -
使用 Newtonsoft. 非常方便的库,通过NuGet可以很方便地安装,以下是我用chatGPT搜索的使用方法,感觉比较详细了。
Newtonsoft.Json.Linq.JObject
是 Newtonsoft.Json 库中用于处理 JSON 数据的核心类之一。它提供了灵活的 API,用于解析、操作和生成 JSON 对象。以下是其常见用法的详细说明:
1. 创建 JSON 对象
可以通过代码动态创建 JSON 数据。
示例
using Newtonsoft.Json.Linq;
var jsonObject = new JObject
{
["Name"] = "Alice",
["Age"] = 25,
["IsStudent"] = true,
["Skills"] = new JArray("C#", "Python", "Java")
};
Console.WriteLine(jsonObject.ToString());
输出
{
"Name": "Alice",
"Age": 25,
"IsStudent": true,
"Skills": ["C#", "Python", "Java"]
}
2. 解析 JSON 字符串
将 JSON 字符串转换为 JObject
。
(补充一个用法:要解析数组时可以用JArray.Parse(),如:var arr = JArray.Parse(jobj[“features”] )
示例
string json = @"{
'Name': 'Bob',
'Age': 30,
'Hobbies': ['Reading', 'Cycling']
}";
var jsonObject = JObject.Parse(json);
Console.WriteLine(jsonObject["Name"]); // 输出: Bob
Console.WriteLine(jsonObject["Age"]); // 输出: 30
Console.WriteLine(jsonObject["Hobbies"]); // 输出: ["Reading", "Cycling"]
3. 访问 JSON 数据
可以通过键直接访问 JSON 对象中的值。
示例
var jsonObject = JObject.Parse(@"{
'Name': 'Charlie',
'Address': {
'City': 'New York',
'ZipCode': '10001'
}
}");
// 直接访问
Console.WriteLine(jsonObject["Name"]); // 输出: Charlie
// 访问嵌套对象
Console.WriteLine(jsonObject["Address"]["City"]); // 输出: New York
4. 修改 JSON 数据
可以动态更新、添加或删除 JSON 数据。
示例
var jsonObject = new JObject
{
["Name"] = "Alice",
["Age"] = 25
};
// 修改值
jsonObject["Age"] = 26;
// 添加新键值对
jsonObject["Gender"] = "Female";
// 删除键值对
jsonObject.Remove("Name");
Console.WriteLine(jsonObject.ToString());
输出
{
"Age": 26,
"Gender": "Female"
}
5. 遍历 JSON 对象
使用 foreach
遍历 JSON 对象中的键值对。
示例
var jsonObject = JObject.Parse(@"{
'Name': 'Alice',
'Age': 25,
'IsStudent': true
}");
foreach (var property in jsonObject.Properties())
{
Console.WriteLine($"{property.Name}: {property.Value}");
}
输出
Name: Alice
Age: 25
IsStudent: True
6. 转换为强类型对象
可以将 JObject
转换为特定类型的对象。
示例
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
string json = @"{ 'Name': 'Alice', 'Age': 25 }";
var jsonObject = JObject.Parse(json);
var person = jsonObject.ToObject<Person>();
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
输出
Name: Alice, Age: 25
7. 转换为 JSON 字符串
将 JObject
转换回 JSON 字符串。
示例
var jsonObject = new JObject
{
["Name"] = "Alice",
["Age"] = 25
};
string jsonString = jsonObject.ToString();
Console.WriteLine(jsonString);
输出
{
"Name": "Alice",
"Age": 25
}
8. 查询 JSON 数据
使用 LINQ 查询 JSON 数据。
示例
var jsonObject = JObject.Parse(@"{
'People': [
{ 'Name': 'Alice', 'Age': 25 },
{ 'Name': 'Bob', 'Age': 30 },
{ 'Name': 'Charlie', 'Age': 35 }
]
}");
// 查询年龄大于30的人
var people = jsonObject["People"]
.Where(p => (int)p["Age"] > 30)
.Select(p => p["Name"]);
foreach (var person in people)
{
Console.WriteLine(person);
}
输出
Charlie
9. 合并 JSON 对象
可以将两个 JObject
合并。
示例
var json1 = new JObject { ["Name"] = "Alice" };
var json2 = new JObject { ["Age"] = 25 };
json1.Merge(json2);
Console.WriteLine(json1.ToString());
输出
{
"Name": "Alice",
"Age": 25
}
10. 检查键是否存在
使用 ContainsKey
检查键是否存在。
示例
var jsonObject = JObject.Parse(@"{
'Name': 'Alice',
'Age': 25
}");
if (jsonObject.ContainsKey("Name"))
{
Console.WriteLine("Key 'Name' exists.");
}
输出
Key 'Name' exists.
总结
JObject
提供了强大的功能来解析、操作和生成 JSON 数据。无论是处理简单的 JSON 对象还是复杂的嵌套 JSON,都非常方便。如果你有更复杂的需求或疑问,请继续提问!