有没有办法在 JsonDocument 和 JsonNode 之间进行转换?

Enr*_*one 7 c# json .net-core system.text.json

在 .NET 6 中,基本上有两种使用 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();
Run Code Online (Sandbox Code Playgroud)

只是为了添加更多上下文,我问自己这个问题,因为JsonDocument它具有不可变的优点,同时JsonNode提供了一种改变 JSON DOM 片段的方法。

我喜欢尽可能使用不可变对象,但同时我需要改变我正在使用的 JSON DOM。执行此操作的可能策略如下:

  1. JsonDocument从字符串(或 JSON 的任何来源)获取 的实例
  2. JsonDocument在代码中始终使用不可变实例
  3. JsonNode从实例中获取 的实例JsonDocument,执行所有突变,然后获取 的新的不可变实例JsonDocument。这可以封装在负责执行所有突变的私有方法中
  4. 继续使用新JsonDocument实例

我在官方文档中没有找到任何线索表明这是可能的,所以这可能是不可能的,并且这些类并未设计为以这种方式工作。

Gur*_*ron 7

您可以使用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>();
Run Code Online (Sandbox Code Playgroud)