在项目开发中,我们有时会对数据进行JSON序列化和反序列化,.NET6以前我们经常这么使用:
Car car = new Car { Name = "卡车",Size="10米*6米" };
var carJson = JsonSerializer.Serialize(car);
var carNew = JsonSerializer.Deserialize<Car>(carJson);
上面的代码中如果我们要操作Json dom就必须将它转换为对应的类实例,对于结构不复杂的json来说这没什么,但是对于结构复杂或者层级很深的json字符串来说,代码量可想而知。因此在.NET6中微软为我们提供了可写的JSON DOM API,它位于System.Text.Json命名空间下,它可以让我们跳过创建类去直接操作JSON DOM。下面我们通过增删改查四个操作来看看它的使用吧。
对于新增操作我们可以使用JsonObject类和JsonArray类去创建JSON DOM:
使用方法如下:
var jo = new JsonObject {
["Message"] = "个人信息",
["Father"] = new JsonObject { ["Name"] = "张三" },
["Son"] = new JsonArray(
new JsonObject {
["Name"] = "张小小",
["Pet"] = new JsonArray("小花狗", "小花猫"),
["Age"]=""
},
new JsonObject {
["Name"] = "张大大",
["Pet"] = new JsonArray("小狼狗", "小公鸡"),
["Age"]=2
})
};
var js= jo.ToJsonString(new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(jsonString);
代码运行之后结果为:
{
"Message": "个人信息",
"Father": {
"Name": "张三"
},
"Son": [
{
"Name": "张小小",
"Pet": ["小花狗", "小花猫"],
"Age":""
},
{
"Name": "张大大",
"Pet": ["小狼狗", "小公鸡"],
"Age":2
}
]
}
代码中可以看出JsonObject类和JsonArray类可以嵌套使用生成JSON DOM节点树,每个DOM节点上的属性都用键值对表示,并且同一数组中的不同节点的属性也可以是不一样(上例中的Age节点)。
查询操作可以使用JsonNode类解析JSON DOM:
使用代码如下:
var njo= JsonNode.Parse(js);
//运行后输出 “张大大”
Console.WriteLine(njo["Son"][1]["Name"]);
从代码中可以看出,我们能通过属性名和索引访问任意的JSON DOM节点。我们也可以先转换成JsonObject对象和JsonArray对象,并使用GetValue方法获取强类型的值,案例代码如下:
if (njo["Son"] is JsonArray ja)
{
//运行后输出“张小小 张大大”
for (int i = 0; i < ja.Count; i++)
{
if (ja[i]["Name"] is JsonObject jo)
{
string name = jo.GetValue<string>();
Console.WriteLine(name);
}
}
}
我们还可以修改现有节点的值,例如将Message节点的值改为“张三的个人信息”:
njo["Message"] = "张三的个人信息";
``
当然,我们不仅能改还可以给节点增加属性和新的节点:
```csharp
//增加新属性
njo["Message"]["Address"] = "XX省XX市XX区XX路XX小区XX号楼XX单元XX";
//增加新节点
njo["SearchDate"] = new JsonObject { ["UTC"] = "2021/12/1 00:00:00",["UTC8"]="2021/12/ 08:00:00" };
对于删除,.NET6并没有提供删除节点的方法,但我们可以使用一个变通的方法来实现,就是通过将节点设为null,序列化时忽略,代码如下:
njo["Message"]["Address"] = null;
njo["SearchDate"] = null;
js = jo.ToJsonString(new JsonSerializerOptions {
WriteIndented = true,
//忽略null的节点不序列化
DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
});
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有