写点什么

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

作者:喵叔
  • 2021 年 12 月 23 日
  • 本文字数:1562 字

    阅读完需:约 5 分钟

在项目开发中,我们有时会对数据进行 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:


  • JsonObject:表示创建 JSON 对象;

  • JsonArray:表示创建 JSON 数组。


使用方法如下:


 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:


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


使用代码如下:


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 });
复制代码


用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6东西--可写的JSON DOM API