Как установить форматирование с помощью JavaScriptSerializer при сериализации JSON? - PullRequest
21 голосов
/ 04 мая 2011

Я использую JavaScriptSerializer для сериализации объектов в файл в формате JSON. Но файл результатов не имеет удобочитаемого форматирования. Как я могу разрешить форматирование, чтобы получить читаемый файл?

Ответы [ 4 ]

33 голосов
/ 04 мая 2011

Вы можете использовать JSON.NET сериализатор, он поддерживает форматирование JSON

string body = JsonConvert.SerializeObject(message, Formatting.Indented);

Yon может загрузить этот пакет через NuGet.

19 голосов
/ 07 ноября 2012

Вот мое решение, которое не требует использования JSON.NET и проще, чем код, связанный с Алексом Жевжиком.

    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();
    }

}
10 голосов
/ 04 мая 2011

Похоже, что нет встроенного инструмента для форматирования вывода JSON-сериализатора.
Я полагаю, что причиной этого является минимизация данных, которые мы отправляем по сети.

Выуверены, что вам нужны отформатированные данные в коде?Или вы хотите анализировать JSON только во время отладки?

Существует множество онлайн-сервисов, которые предоставляют такую ​​функциональность: 1 , 2 .Или автономное приложение: JSON viewer .

Но если вам нужно форматирование внутри приложения, вы можете написать соответствующий код самостоятельно.

8 голосов
/ 23 мая 2014

Я также хотел иметь возможность отформатировать JSON, не полагаясь на сторонний компонент. Решение Марка Лакаты сработало хорошо (спасибо Марку), но я хотел, чтобы скобки и табуляция были такими же, как в ссылке Алекса Жевжика. Итак, вот измененная версия кода Марка, которая работает таким образом, на случай, если кто-то еще захочет:

/// <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
                {
                    stringBuilder.Append(character);
                }
            }
            else
            {
                stringBuilder.Append(character);
            }
        }
    }

    return stringBuilder.ToString();
}
...