【问题标题】:Why should I use JSON with ASP.NET?为什么我应该在 ASP.NET 中使用 JSON?
【发布时间】:2009-01-15 14:20:36
【问题描述】:

为什么要在 ASP.NET 中使用 JSON?你能举一个实际的例子吗?我读过文章,但不是很好。

【问题讨论】:

    标签: asp.net json


    【解决方案1】:

    从网络服务返回数据怎么样? 以下是适用于 .Net 2.0 的两种方法,它们采用 DataTable 或 DataRow 参数,并返回 JSON 格式的字符串以从 Web 服务发送到客户端:

    public string GetJson(DataRow r)
        {
            int index = 0;
            StringBuilder json = new StringBuilder();
            foreach (DataColumn item in r.Table.Columns)
            {
                json.Append(String.Format("\"{0}\" : \"{1}\"", item.ColumnName, r[item.ColumnName].ToString().Replace("\"","\\\"")));
                if (index < r.Table.Columns.Count - 1)
                {
                    json.Append(", ");
                }
                index++;
            }
            return "{" + json.ToString() + "}";
        }
    
    public string GetJson(DataTable t)
    {
        int index = 0;
        StringBuilder json = new StringBuilder();
        foreach (DataRow currRow in t.Rows)
        {
            json.Append(GetJson(currRow));
            if (index < t.Rows.Count - 1)
            {
                json.Append(", ");
            }
        }
        return "[" + json.ToString() + "]";
    }
    

    然后可以在客户端上发送和评估结果。

    【讨论】:

    • 你只需要在数据表方法中增加你的索引
    【解决方案2】:

    JSON 非常适合添加 Ajax 功能。例如,您可以使用返回 JSON 对象的 Ajax 请求返回的一些值填充 ComboBox 的内容。

    ASP.NET Ajax 在内部使用 JSON。如果你在使用另一个框架,比如 jQuery,你自己做客户端和服务器端。

    JSON 很容易被人和计算机读取,并且引入的开销很小。 JavaScript 客户端代码可以原生解析 JSON。

    【讨论】:

      【解决方案3】:

      有很多用途、API、Web 服务,而且它的开销比 XML 少得多。作为实际示例,您可以通过几行代码使用 JSON 数据填充 ExtJs 树或网格。

      如果您使用的是 ASP.NET MVC,那么从控制器返回 JSON 非常容易,如下所示:

      // this method return JSON directly
      public JsonResult GetData() {
      
          data = LoadData(); // load the data from a database or a service
          return Json(data); // will serialize your data object as JSON
      
      }
      

      【讨论】:

        【解决方案4】:

        使用 JSON,因为它很容易在浏览器中解析 - 只需调用 eval() 即可完成。

        只要我们将 DataTable 共享到 JSON 实现:

            public static string DataTableToJSON(DataTable dt)
            {
                string rowDelimiter = "";
        
                StringBuilder result = new StringBuilder("[");
                foreach (DataRow row in dt.Rows)
                {
                    result.Append(rowDelimiter);
                    result.Append(DataRowToJSON(row));
                    rowDelimiter = ",";
                }
                result.Append("]");
        
                return result.ToString();
            }
        
            public static string DataRowToJSON(DataRow row)
            {
                DataColumnCollection cols = row.Table.Columns;
                string colDelimiter = "";
        
                StringBuilder result = new StringBuilder("{");       
                for (int i = 0; i < cols.Count; i++)
                { // use index rather than foreach, so we can use the index for both the row and cols collection
                    result.AppendFormat("{0}\"{1}\":{2}",
                            colDelimiter, cols[i].ColumnName,
                            PrepJSONValue(row[i], cols[i].DataType));
        
                    colDelimiter = ",";
                }
                result.Append("}");
                return result.ToString();
            }
        
            // possible types:
            // http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype(VS.80).aspx
            private static Type[] numeric = new Type[] {typeof(byte), typeof(decimal), typeof(double), 
                                             typeof(Int16), typeof(Int32), typeof(SByte), typeof(Single),
                                             typeof(UInt16), typeof(UInt32), typeof(UInt64)};
        
            private static long EpochTicks = new DateTime(1970, 1, 1).Ticks;
        
            private static string PrepJSONValue(object value, Type DataType)
            {
                // null
                if (value == DBNull.Value) return "null";
        
                // numeric
                if (Array.IndexOf(numeric, DataType) > -1)
                    return value.ToString(); // TODO: eventually want to use a stricter format
        
                // boolean
                if (DataType == typeof(bool))
                    return ((bool)value) ? "true" : "false";
        
                // date -- see http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
                if (DataType == typeof(DateTime))       
                    return "\"\\/Date(" + new TimeSpan(((DateTime)value).ToUniversalTime().Ticks - EpochTicks).TotalMilliseconds.ToString() + ")\\/\"";
        
                // TODO: add Timespan support
                // TODO: add Byte[] support
        
                // string/char
                return "\"" + value.ToString().Replace(@"\", @"\\").Replace(Environment.NewLine, @"\n").Replace("\"", @"\""") + "\"";
            }
        

        【讨论】:

        【解决方案5】:

        返回 JSON 对象的 Ajax 调用可以简单地转换为 JavaScript 对象,例如

        var jsObject = eval( "(" + ajaxCallReturningJson(whatever) + ")" );
        

        这使得将复杂数据传递给客户端非常方便,而无需进行自定义表示或使用 XML/XSLT。

        【讨论】:

          【解决方案6】:

          JSON 比 XML 更容易解析,而且有很多选择。

          【讨论】:

            【解决方案7】:

            这是一种将 javascript 对象直接注入您的网页的方法,该对象可在您的所有其他客户端脚本中使用 OOP 表示法访问,而无需在客户端进行解析或处理。

            【讨论】:

              【解决方案8】:

              你有什么选择? XML 比 JSON 重,因此它使用更多带宽(但对于验证和转换数据非常强大), YAML 需要缩进和换行符,使其成为通过 Http 发送的次优格式(但适合存储日志、数据和配置)。 JSON 是原生 javascript,而且轻量级,所以它在客户端和通过 Http 传输非常棒

              【讨论】:

                【解决方案9】:

                这是一篇非常好的文章,介绍了为什么 JSON 是发送和接收数据的首选方法。

                http://robtiffany.com/windows-phone-7/windows-phone-7-line-of-business-app-dev-building-a-wcf-rest-json-service

                【讨论】:

                  猜你喜欢
                  • 2012-01-25
                  • 1970-01-01
                  • 2010-11-18
                  • 2010-10-26
                  • 2016-08-07
                  • 1970-01-01
                  • 2013-10-26
                  • 2017-07-12
                  • 1970-01-01
                  相关资源
                  最近更新 更多