【问题标题】:How to set formatting with JavaScriptSerializer when JSON serializing?JSON序列化时如何使用JavaScriptSerializer设置格式?
【发布时间】:2011-08-18 09:09:08
【问题描述】:

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

【问题讨论】:

    标签: .net json serialization formatting javascriptserializer


    【解决方案1】:

    你可以使用JSON.NET序列化器,它支持JSON格式

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

    你可以通过 NuGet 下载this package

    【讨论】:

    • 您甚至可以设置所需的格式设置 JsonConvert.SerializeObject(message, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() });跨度>
    【解决方案2】:

    这是我的解决方案,它不需要使用 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();
        }
    
    }
    

    【讨论】:

    • 为什么使用IDisposable?为什么不直接将Process 设为静态方法?
    • @tenfour - 你是绝对正确的。这段代码 sn-p 来自一个更大的块,它为 stackoverflow 进行了简化......我将进一步简化它。
    • 这不是适合所有人的解决方案!如果您的项目是 .NET 4 或者您的项目不是 Web 名称,您将遇到页面图像(或格式)冲突!请注意,您正在使用 System.Web.Extensions(需要 .NET4.5!)来引入 System.Web.Script.Serialization!具体的解决方案应该使用 NuGet 获取 Newtonsoft 并使用 JsonConvert.SerializeObject
    • 如果你确实使用制表符,代码会更加简单和优雅——顺便说一句,这正是它们的目的。
    【解决方案3】:

    我还希望能够在不依赖第三方组件的情况下格式化 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();
    }
    

    【讨论】:

      【解决方案4】:

      似乎没有用于格式化 JSON-serializer 输出的内置工具。
      我想发生这种情况的原因是减少了我们通过网络发送的数据。

      您确定在代码中需要格式化数据吗?或者您只想在调试期间分析 JSON?

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

      但如果你需要在应用程序内部格式化,你可以自己写appropriate code

      【讨论】:

      • Link 2 说... Python 2.5 不再可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2021-09-02
      • 2015-01-11
      • 2011-12-17
      相关资源
      最近更新 更多