如何使用System.Text.Json对未知对象进行漂亮打印

41
使用System.Text.Json,我可以使用序列化选项来漂亮地打印JSON。
var options = new JsonSerializerOptions{ WriteIndented = true };
jsonString = JsonSerializer.Serialize(typeToSerialize, options);

然而,我有一个字符串JSON,但不知道具体的类型。我该如何漂亮地打印JSON字符串?
我的旧代码使用Newtonsoft,我可以在不进行序列化/反序列化的情况下完成这个操作。
public static string JsonPrettify(this string json)
{
    if (string.IsNullOrEmpty(json))
    {
        return json;
    }

    using (var stringReader = new StringReader(json))
    using (var stringWriter = new StringWriter())
    {
        var jsonReader = new JsonTextReader(stringReader);
        var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented };
        jsonWriter.WriteToken(jsonReader);
        return stringWriter.ToString();
    }
}

没有内置的 API 可以将 Utf8JsonReader 复制到 Utf8JsonWriter,所以解析为 JsonDocument 并重新序列化似乎是可行的方法。请参见如何将 System.Text.JsonElement 美化打印(格式化)为字符串 - dbc
3个回答

59

这个有效:

using System.Text.Json;
public static string JsonPrettify(this string json)
{
    using var jDoc = JsonDocument.Parse(json);
    return JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true });
}

3
JsonDocument实现了IDisposable接口,必须进行处理以便将池化内存返回给内存池进行重用。 - dbc
1
你说得对,@dbc。我添加了一个using。发现得好。 - dlumpp
这个不起作用。 ObjectDisposedException: 无法访问已释放的对象。 对象名称: 'JsonDocument'。 - HamsterWithPitchfork

0
这个有效:

    private static string PrettifyJson(string jsonString)
    {
        using (JsonDocument jsonDocument = JsonDocument.Parse(jsonString)){
            // Convert the JsonDocument back to a pretty-printed JSON string
            string prettifiedJson = 
            System.Text.Json.JsonSerializer.Serialize(jsonDocument.RootElement, new 
                JsonSerializerOptions
                {
                    WriteIndented = true
                });
            return prettifiedJson;
        }
    }


-1
你可以使用Newtonsoft.Json的JToken类来实现它。 这是代码。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static string JsonPrettify(this string json)
{
    if (string.IsNullOrEmpty(json))
    {
        return json;
    }
    return JToken.Parse(json).ToString(Formatting.Indented);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接