在 C# 中简单地美化 JSON [重复]

Posted

技术标签:

【中文标题】在 C# 中简单地美化 JSON [重复]【英文标题】:Simply Beautify a JSON in C# [duplicate] 【发布时间】:2020-04-28 11:16:05 【问题描述】:

我一直在寻找一种简单的原生方法来美化 C# 中的 JSON,但没有一个喜欢的,所以我自己做了并在这里分享,希望对你有帮助;)

它像这样转换压缩的 JSON:

["level":1,"exp":110,"energyGranted":5,"itemGranted":null,"level":2,"exp":195,"energyGranted":5,"itemGranted":null,"level":3,"exp":296,"energyGranted":5,"itemGranted":null]

像这样格式良好的 JSON:

[
    
        "level": 1,
        "exp": 110,
        "energyGranted": 5,
        "itemGranted": null
    ,
    
        "level": 2,
        "exp": 195,
        "energyGranted": 5,
        "itemGranted": null
    ,
    
        "level": 3,
        "exp": 296,
        "energyGranted": 5,
        "itemGranted": null
    
]

上下文:我正在处理一个处理从后端获得的 JSON 响应的 Unity 项目。我不想仅仅为了这个简单的任务而附加一些第三方 C# 库。 有 JsonUtility.ToJson(obj, prettyPrint) Unity 内置方法可以做到这一点,但只能来自对象,而不是 JSON,因此我需要。

【问题讨论】:

这能回答你的问题吗? JSON formatter in C#? 我错过了这一点:***.com/a/57100143/4052438 感谢您的链接和您的时间! 【参考方案1】:

您是否尝试过将字符串转换为对象然后使用 ToJson 函数?

var myObj = JsonUtility.FromJson<YourClass>(jsonString);
var prettyString = JsonUtility.ToJson(myObj);

【讨论】:

在我的上下文中,我不知道 YourClass 中有什么,因为我不知道我的 JSON 中有什么:它是从我正在测试的后端返回的。此外,您的解决方案意味着创建此类,如果您有很多不同的 JSON 结构,例如我的情况,那么仅格式化 JSON 有点矫枉过正。【参考方案2】:

所以这是我的解决方案,它使用正则表达式组将 JSON 拆分为多行,并根据组修改缩进。

为了避免使正则表达式复杂化,我没有处理空格,因此它需要一个压缩的 JSON。

using System.Text; // used for StringBuilder, a better string concatenation than myStr += "content"
using System.Text.RegularExpressions;

public static class JsonUtil

    public static string Beautify(string json)
    
        const int indentWidth = 4;
        const string pattern = "(?>([\\[][\\]],?)|([\\[])|([\\]],?)|([^:]+:)([^\\[\\],]*(?>([\\[])|,)?)|([^\\[\\],]+,?))";

        var match = Regex.Match(json, pattern);
        var beautified = new StringBuilder();
        var indent = 0;
        while (match.Success)
        
            if (match.Groups[3].Length > 0)
                indent--;

            beautified.AppendLine(
                new string(' ', indent * indentWidth) +
                (match.Groups[4].Length > 0
                    ? match.Groups[4].Value + " " + match.Groups[5].Value
                    : (match.Groups[7].Length > 0 ? match.Groups[7].Value : match.Value))
            );

            if (match.Groups[2].Length > 0 || match.Groups[6].Length > 0)
                indent++;

            match = match.NextMatch();
        

        return beautified.ToString();
    

要使用它:var beautifiedJson = JsonUtil.Beautify(json);

就性能而言,它可能不是最好的解决方案,但它非常适合我的使用^^

如果你有更好的,请花时间分享它;)

【讨论】:

以上是关于在 C# 中简单地美化 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Unity C#简单JSON到数组[重复]

使用 LitJson 在 C# 中反序列化 JSON 对象数组 [重复]

使用 C# 在复杂的 JSON 数组中查找和打印重复项

在 JSON (C#) 中序列化枚举值 [重复]

如何使用 C# 在 POST 请求中发送 json 数据 [重复]

在C#中解析Json rest api响应[重复]