.net / C# 中JSON的反序列化

C#中反序列化一个JSON文件,往往需要先创建一个结构相同的类,这也是很多人和官方推荐的,但有时候只需要JSON中的一小部分信息,专门创建一个类很折腾。

这是官方的用法:如何将 JSON 读取为 .NET 对象(反序列化)

如果不想用.net类进行反序列化,根据本人经验,有2个办法:

  1. 使用 Visual Studio 2022 自动生成所需的类(还是用了类,但比较方便,亲测有效)
    1)复制需要反序列化的 JSON。
    2)创建一个类文件并删除模板代码。
    3)选择编辑>选择性粘贴>将 JSON 粘贴为类。

  2. 使用 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,都非常方便。如果你有更复杂的需求或疑问,请继续提问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值