是否有一种方法在JsonDocument和JsonNode之间转换?



在。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。一个可行的策略是:

  1. 从字符串(或任何JSON源)获取JsonDocument的实例
  2. 在代码
  3. 中使用不可变的JsonDocument实例
  4. JsonDocument实例中获取JsonNode实例,执行所有的突变,然后获得JsonDocument的一个新的不可变实例。这可以封装在一个私有方法中,负责执行所有的突变
  5. 继续使用新的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

相关内容

  • 没有找到相关文章

最新更新