写点什么

.NET6 新东西 ---System.Text.Json Writeable DOM

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

    阅读完需:约 4 分钟

在.NET 6 中,微软加入了 JSON Node,可以让我们动态编辑一个 JSON 文档,就像 Newtonsoft.Json 里的 JToken 一样,我们就可以更加灵活的操作 JSON 文档。这次主要新增的 API 如下表:



我们可以使用 JsonNode.Parse()方法将 JSON 转换成一个 JsonNode 对象,示例如下:


JsonNode jn = JsonNode.Parse("{\"age\":42}");//方法一int v = (int)jn["age"];Debug.Assert(v == 42);//方法二v = jn["age"].GetValue<int>();Debug.Assert(v== 42);
复制代码


我们可以通过 AsObject 将 JsonToken 转换为 JsonObject,通过 AsArray 将 JArray 转换为 JsonArray,通过 AsValue 将 JValue 转换为 JsonValue。对于 JsonNode 和 JsonValue 可以通过强制类型转成希望的类型,或者通过 GetValue 来转成类型,这类似于 Newtonsoft.Json 中的 Value<T>()方法,代码如下:


var jn = JsonNode.Parse("{\"age\":42}").AsObject();//方法一var jv = jn["age"].AsValue();var v= (int)jv;Debug.Assert(v== 42);//方法二v = jValue.GetValue<int>();Debug.Assert(v== 42);
复制代码


下面我们来看看修改 JSON 文档的例子:


var tobj= new {Name = "张三", Age = 42};var jString= JsonSerializer.Serialize(tobj);var jNode= JsonNode.Parse(jString);if (jNode is JsonObject jObj){    jObj["Name"]?.GetValue<string>().Dump();    jObj["Age"]?.GetValue<int>().Dump();    jObj["Name"] = "李四";    jObj.ToJsonString().Dump();}
复制代码


在上面的代码中 Dump 方法是封装的扩展方法,它会把 value 值打印在控制台中。下面我们来看一下 JSON 数组的例子:


var tArrayJsonString = JsonSerializer.Serialize(new[]{    new {Name = "张三", Age = 30}, new {Name = "李四", Age = 20}, new {Name = "王五", Age = 10}});jNode= JsonNode.Parse(tArrayJsonString);if (jNode is JsonArray jArray){    jArray.Select(item => $"{item["Name"]}, {item["Age"]}")        .StringJoin(Environment.NewLine)        .Dump();}
复制代码


对于复杂的组合 JSON,我们可以按照如下代码进行处理:


var complexObj = new{    Name = "VIP",     Users = new[]    {        new {Name = "张三", Age = 60},         new {Name = "李四", Age = 70}    }};var jString = JsonSerializer.Serialize(complexObj);jString.Dump();var jNode = JsonNode.Parse(jsonString);jNode?["Users"]?.AsArray().Select(item => $"{item["Name"]}, {item["Age"]}")    .StringJoin(Environment.NewLine)    .Dump();
复制代码


需要注意的是现在有一点点 JSON Path 支持,JSON Path 和 XML Path 一样,可以让我们高效的找到对应的 JSON 节点,但目前支持的并不好。JsonNode 提供 GetPath 方法来获取当前 Node 对应的 JSON Path,但是目前对于根据 JSON Path 查询的支持还是有问题。代码如下:


jNode["Users"][0]["Name"].GetPath().Dump();JsonNode.Parse(@"{""Prop1"":1}")["Prop1"].GetPath().Dump();
复制代码


用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6新东西---System.Text.Json Writeable DOM