Как установить форматирование с помощью JavaScriptSerializer при сериализации JSON?

При компиляции кода C# в .exe он компилируется в байт-код Общего промежуточного языка (CIL). Каждый раз, когда Вы выполняете исполняемый файл CIL, он выполняется на виртуальной машине Общеязыковой среды выполнения (CLR) Microsofts. Так не, не возможно включать скручивание жгутов VM Ваш исполняемый файл.NET. Необходимо было установить время выполнения.NET на любых клиентских машинах, куда программа будет работать.

Для ответа на второй вопрос.NET является платформой, в которой это - ряд библиотек, компиляторов и VM, который не является конкретным языком. Таким образом, можно кодировать на платформе.NET в C#, VB, C++ и любых других языках, которые имеют компилятор.NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

вышеупомянутая страница имеет список языков, которые имеют версии.NET, а также ссылки на их страницы.

23
задан Peter17 4 May 2011 в 09:18
поделиться

4 ответа

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

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

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

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

11
ответ дан 29 November 2019 в 00:51
поделиться

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

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

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

33
ответ дан 29 November 2019 в 00:51
поделиться

Вот мое решение, которое не требует использования 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();
    }

}
20
ответ дан 29 November 2019 в 00:51
поделиться

Я также хотел иметь возможность отформатировать 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();
}
10
ответ дан 29 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: