前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET6东西--可写的JSON DOM API

.NET6东西--可写的JSON DOM API

作者头像
喵叔
发布2021-12-24 14:14:08
6470
发布2021-12-24 14:14:08
举报
文章被收录于专栏:喵叔's 专栏

在项目开发中,我们有时会对数据进行JSON序列化和反序列化,.NET6以前我们经常这么使用:

代码语言:javascript
复制
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:

  • JsonObject:表示创建JSON对象;
  • JsonArray:表示创建JSON数组。

使用方法如下:

代码语言:javascript
复制
 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);

代码运行之后结果为:

代码语言:javascript
复制
{
  "Message": "个人信息",
  "Father": {
    "Name": "张三"
  },
  "Son": [
    {
      "Name": "张小小",
      "Pet": ["小花狗", "小花猫"],
      "Age":""
    },
     {
      "Name": "张大大",
      "Pet": ["小狼狗", "小公鸡"],
      "Age":2
    }
  ]
}

代码中可以看出JsonObject类和JsonArray类可以嵌套使用生成JSON DOM节点树,每个DOM节点上的属性都用键值对表示,并且同一数组中的不同节点的属性也可以是不一样(上例中的Age节点)。

查询操作

查询操作可以使用JsonNode类解析JSON DOM:

  • JsonNode:解析Json字符串并从节点获取值。

使用代码如下:

代码语言:javascript
复制
var njo= JsonNode.Parse(js);
//运行后输出 “张大大”
Console.WriteLine(njo["Son"][1]["Name"]);

从代码中可以看出,我们能通过属性名和索引访问任意的JSON DOM节点。我们也可以先转换成JsonObject对象和JsonArray对象,并使用GetValue方法获取强类型的值,案例代码如下:

代码语言:javascript
复制
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节点的值改为“张三的个人信息”:

代码语言:javascript
复制
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,序列化时忽略,代码如下:

代码语言:javascript
复制
njo["Message"]["Address"] = null;
njo["SearchDate"] = null;

js = jo.ToJsonString(new JsonSerializerOptions { 
    WriteIndented = true, 
     //忽略null的节点不序列化
    DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull 
    });
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 新增操作
  • 查询操作
  • 修改操作
  • 删除操作
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档