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

简介: .NET6新东西---System.Text.Json Writeable DOM

在.NET 6中,微软加入了JSON Node,可以让我们动态编辑一个JSON文档,就像Newtonsoft.Json里的JToken一样,我们就可以更加灵活的操作JSON文档。

这次主要新增的API如下表:

image.png

我们可以使用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()方法,代码如下:

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();
目录
相关文章
|
7月前
|
存储 JSON JavaScript
|
JSON JavaScript 网络安全
DOM转JSON的实现
DOM转JSON的实现
DOM转JSON的实现
|
设计模式 JSON 前端开发
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(2)
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
120 0
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(2)
|
JSON 自然语言处理 JavaScript
JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解-2
JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解
98 0
|
XML 存储 JSON
JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解-1
JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解
189 0
JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解-1
|
JSON JavaScript API
.NET6东西--可写的JSON DOM API
.NET6东西--可写的JSON DOM API
259 0
|
Web App开发 JSON JavaScript
JavaScript---网络编程(5)-自定义对象Json、Dom模型概念讲解
这节博客主要讲解Dom模型概念~和JSON的简单介绍 首先,还是先上out.js的代码: function println(param){ document.write(param+""); } function print(param){ document.write(param); } 什么是 DOM? DOM 是 W3C(万维网联盟)的标准。
1290 0
|
3月前
|
JSON PHP 数据格式
|
3月前
|
JSON JavaScript 前端开发
JavaScript 如何对 JSON 数据进行冒泡排序?
JavaScript 如何对 JSON 数据进行冒泡排序?
51 0
|
1月前
|
存储 JSON Apache
揭秘 Variant 数据类型:灵活应对半结构化数据,JSON查询提速超 8 倍,存储空间节省 65%
在最新发布的阿里云数据库 SelectDB 的内核 Apache Doris 2.1 新版本中,我们引入了全新的数据类型 Variant,对半结构化数据分析能力进行了全面增强。无需提前在表结构中定义具体的列,彻底改变了 Doris 过去基于 String、JSONB 等行存类型的存储和查询方式。
揭秘 Variant 数据类型:灵活应对半结构化数据,JSON查询提速超 8 倍,存储空间节省 65%