如何在JSON序列化时使用JavaScriptSerializer设置格式?

27

我正在使用JavaScriptSerializer将对象序列化为JSON格式的文件。但结果文件没有可读的格式。如何允许格式化以获得可读文件?

我使用JavaScriptSerializer将对象序列化为JSON格式的文件,但是生成的文件没有易读的格式。请问如何使生成的文件带有易读的格式?
4个回答

34
你可以使用JSON.NET序列化器,它支持JSON格式。
string body = JsonConvert.SerializeObject(message, Formatting.Indented);

您可以通过 NuGet 下载此软件包


你甚至可以设置所需的格式设置 JsonConvert.SerializeObject(message, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() }); - Michael D. Irizarry

24

这是我的解决方案,不需要使用JSON.NET,并且比Alex Zhevzhik链接的代码更简单。

    using System.Web.Script.Serialization; 
    // add a reference to System.Web.Extensions


    public void WriteToFile(string path)
    {
        var serializer     = new JavaScriptSerializer();
        string json        = serializer.Serialize(this);
        string json_pretty = JSON_PrettyPrinter.Process(json);
        File.WriteAllText(path, json_pretty );
    }

这里是格式化程序。

class JSON_PrettyPrinter
{
    public static string Process(string inputText)
    {
        bool escaped = false;
        bool inquotes = false;
        int column = 0;
        int indentation = 0;
        Stack<int> indentations = new Stack<int>();
        int TABBING = 8;
        StringBuilder sb = new StringBuilder();
        foreach (char x in inputText)
        {
            sb.Append(x);
            column++;
            if (escaped)
            {
                escaped = false;
            }
            else
            {
                if (x == '\\')
                {
                    escaped = true;
                }
                else if (x == '\"')
                {
                    inquotes = !inquotes;
                }
                else if ( !inquotes)
                {
                    if (x == ',')
                    {
                        // if we see a comma, go to next line, and indent to the same depth
                        sb.Append("\r\n");
                        column = 0;
                        for (int i = 0; i < indentation; i++)
                        {
                            sb.Append(" ");
                            column++;
                        }
                    } else if (x == '[' || x== '{') {
                        // if we open a bracket or brace, indent further (push on stack)
                        indentations.Push(indentation);
                        indentation = column;
                    }
                    else if (x == ']' || x == '}')
                    {
                        // if we close a bracket or brace, undo one level of indent (pop)
                        indentation = indentations.Pop();
                    }
                    else if (x == ':')
                    {
                        // if we see a colon, add spaces until we get to the next
                        // tab stop, but without using tab characters!
                        while ((column % TABBING) != 0)
                        {
                            sb.Append(' ');
                            column++;
                        }
                    }
                }
            }
        }
        return sb.ToString();
    }

}

1
为什么要使用 IDisposable?为什么不直接将 Process 设为静态方法? - tenfour
@tenfour - 你说得完全正确。这段代码片段来自一个更大的代码块,为了在stackoverflow上简化,我将进一步简化它。 - Mark Lakata
这不是所有人的解决方案!如果你的项目是 .NET 4 或者不是网站设计,你可能会遇到页面图像(或格式)冲突!请注意,你需要使用 System.Web.Extensions(需要 .NET4.5!)引入 System.Web.Script.Serialization!!为了得到一个具体的解决方案,你应该使用 NuGet 获取 Newtonsoft 并使用 JsonConvert.SerializeObject。 - Jenna Leaf
如果您使用制表符,代码将会更加简单和优雅 - 顺便说一下,这正是它们的目的所在。 - Zeus

19

我也希望能够有格式化的JSON而不依赖于第三方组件。Mark Lakata的解决方案效果很好(谢谢Mark),但我想让括号和缩进像Alex Zhevzhik链接中的那样。因此,这是一个经过调整的Mark代码版本,以实现这种方式,如果有人需要它:

/// <summary>
/// Adds indentation and line breaks to output of JavaScriptSerializer
/// </summary>
public static string FormatOutput(string jsonString)
{
    var stringBuilder = new StringBuilder();

    bool escaping = false;
    bool inQuotes = false;
    int indentation = 0;

    foreach (char character in jsonString)
    {
        if (escaping)
        {
            escaping = false;
            stringBuilder.Append(character);
        }
        else
        {
            if (character == '\\')
            {
                escaping = true;
                stringBuilder.Append(character);
            }
            else if (character == '\"')
            {
                inQuotes = !inQuotes;
                stringBuilder.Append(character);
            }
            else if (!inQuotes)
            {
                if (character == ',')
                {
                    stringBuilder.Append(character);
                    stringBuilder.Append("\r\n");
                    stringBuilder.Append('\t', indentation);
                }
                else if (character == '[' || character == '{')
                {
                    stringBuilder.Append(character);
                    stringBuilder.Append("\r\n");
                    stringBuilder.Append('\t', ++indentation);
                }
                else if (character == ']' || character == '}')
                {
                    stringBuilder.Append("\r\n");
                    stringBuilder.Append('\t', --indentation);
                    stringBuilder.Append(character);
                }
                else if (character == ':')
                {
                    stringBuilder.Append(character);
                    stringBuilder.Append('\t');
                }
                else if (!Char.IsWhiteSpace(character))
                {
                    stringBuilder.Append(character);
                }
            }
            else
            {
                stringBuilder.Append(character);
            }
        }
    }

    return stringBuilder.ToString();
}

13

看起来似乎没有内置工具来格式化JSON序列化器的输出。
我想这是为了最小化我们通过网络发送的数据。

你确定你需要在代码中使用格式化后的数据吗?还是只是想在调试期间分析JSON?

有很多在线服务提供此功能:12。 或者独立应用程序:JSON viewer

但如果您需要应用程序内部的格式化,可以自己编写适当的代码


链接2显示... Python 2.5不再可用。 - Chris Catignani

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