在。net 6中,基本上有两种处理JSON DOM的方法:
- 通过JsonDocument类使用不可变JSON DOM 通过JsonNode类使用可变JSON DOM
更多信息可以在这里找到
我问自己是否有可能从JsonDocument
的实例转换为JsonNode
的实例,反之亦然。基本上我要找的是这样的内容:
using System.Text.Json;
using System.Text.Json.Nodes;
const string jsonText = "{"name": "Bob"}";
var jsonNode = JsonNode.Parse(jsonText);
// This code doesn't compile. This is just an example to illustrate what I'm looking for
JsonDocument jsonDocument = jsonNode!.ToJsonDocument();
只是为了添加更多的上下文,我问自己这个问题,因为JsonDocument
具有不可变的优势,而JsonNode
提供了一种改变JSON DOM块的方法。
我喜欢尽可能地使用不可变对象,但同时我需要改变我正在使用的JSON DOM。一个可行的策略是:
- 从字符串(或任何JSON源)获取
JsonDocument
的实例 - 在代码 中使用不可变的
- 从
JsonDocument
实例中获取JsonNode
实例,执行所有的突变,然后获得JsonDocument
的一个新的不可变实例。这可以封装在一个私有方法中,负责执行所有的突变 - 继续使用新的
JsonDocument
实例
JsonDocument
实例我没有在官方文档中找到任何线索表明这是可能的,所以可能这是不可能的,这些类并没有被设计成这样工作。
您可以使用Deserialize
在两者之间进行转换:
const string jsonText = "{"name": "Bob", "inner": {"names": ["Bob"]}}";
var jsonNode = JsonNode.Parse(jsonText);
using var deserializeDoc = jsonNode.Deserialize<JsonDocument>();
var deserializeNode = deserializeDoc.Deserialize<JsonNode>();
我的首选选项是不使用原始json而使用类型,但您可以使用json字符串在两者之间移动。
一种方法容易,另一种方法"更难"。因为你需要多行从JsonDocument到字符串(JsonDocument get JSON string)。下面是一个玩具示例:
var jsonNode = JsonNode.Parse(jsonText);
var jsonDocument = JsonDocument.Parse(jsonNode!.ToJsonString());
var jsonNode2 = JsonNode.Parse(JsonDocumentToString(jsonDocument));
string JsonDocumentToString(JsonDocument jsonDocument)
{
using var stream = new System.IO.MemoryStream();
using (var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true }))
{
jsonDocument.WriteTo(writer);
}
return System.Text.Encoding.UTF8.GetString(stream.ToArray());
}
我觉得一行比较方便
JsonDocument doc = JsonDocument.Parse(jsonNode.ToJsonString());
,但在你的情况下,它没有任何意义。为什么不用JsonDocument解析json