C# JsonDocument获取JSON字符串

C# JsonDocument获取JSON字符串,c#,.net-core-3.0,C#,.net Core 3.0,我需要一个从JsonDocument获取JSON字符串的示例。我可以使用RootElement.GetProperty(“ItemName”)获取属性,然后调用.GetString(),但是找不到一种方法只将根元素作为JSON字符串获取 这里有一个例子: JsonDocument jdoc = JsonDocument.Parse("{\"a\":123}"); using(var stream = new MemoryStream()) { Utf8JsonWriter writer

我需要一个从JsonDocument获取JSON字符串的示例。我可以使用
RootElement.GetProperty(“ItemName”)
获取属性,然后调用
.GetString()
,但是找不到一种方法只将根元素作为JSON字符串获取

这里有一个例子:

JsonDocument jdoc = JsonDocument.Parse("{\"a\":123}");

using(var stream = new MemoryStream())
{
    Utf8JsonWriter writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true });
    jdoc.WriteTo(writer);
    writer.Flush();
    string json = Encoding.UTF8.GetString(stream.ToArray());
}
为了便于使用,您可以将其放入扩展方法中,如:

public static string ToJsonString(this JsonDocument jdoc)
{
    using (var stream = new MemoryStream())
    {
        Utf8JsonWriter writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true });
        jdoc.WriteTo(writer);
        writer.Flush();
        return Encoding.UTF8.GetString(stream.ToArray());
    }
}
然后像这样使用它:

JsonDocument jdoc = JsonDocument.Parse("{\"a\":123}");
string json = jdoc.ToJsonString();

官方文档中有两段代码片段,请参见


A. 以下示例显示如何从JsonDocument编写JSON:

(这里的代码段非常长)
上述代码:

  • 读取JSON文件,将数据加载到JsonDocument,并将格式化(打印精美)的JSON写入文件
  • 使用JsonDocumentOptions指定允许但忽略输入JSON中的注释
  • 完成后,在编写器上刷新调用。另一种方法是让写入程序在释放时自动刷新
B 以下示例显示如何使用Utf8JsonWriter类:

(…)
剪下的部分可以调整为使用
JsonDocument.Parse

using var stream = new System.IO.MemoryStream();
using (var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true }))
{
   var jsonDocument = JsonDocument.Parse(content);
   jsonDocument.WriteTo(writer);
}

var formatted = System.Text.Encoding.UTF8.GetString(stream.ToArray());

JsonDocument
(以及
System.Text.Json
中的所有其他类)针对性能和最小分配进行了优化。将整个文档作为字符串获取将完全违背这一点,它唯一能做的就是将自身序列化为
Utf8JsonWriter
。尽管如此,如果您真的想这样做,
JsonSerializer.Serialize(document.RootElement)
似乎可以做到这一点。它实际上相当复杂?例如,假设JsonDocument很大,是否希望调试器自动呈现ToString()?假设有一些编码选项,或者您想将其完全写入字符串?你可能想把它打印出来(或者不打印)。有一百万和一个权衡需要考虑。