65.9K
CodeProject 正在变化。 阅读更多。
Home

通用 C# JSON 生成器,用于将任何数据发送到 JavaScript

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.62/5 (10投票s)

2008年2月23日

CPOL

2分钟阅读

viewsIcon

85207

downloadIcon

807

通用 C# JSON 生成器,用于将任何托管数据发送到 JavaScript,并使用相同的语法进行访问。

引言

您希望如何在 C# 中拥有任何数据(例如这个 3.5 示例)……

C#

...并从 JavaScript 访问它,使用与 C# 相同的语法

Javascript

“他们是怎么做到的?”

当时我正在使用 ASP.NET 构建一个简单的 Ajax 应用程序,并且很难将数据从 ASP.NET 的代码隐藏发送到 JavaScript 代码。然后我发现了 JSON,它解决了所有问题。 JSON 的好处在于它是一种浏览器可以理解的格式,并且可以用于在其 JavaScript 引擎中创建相当复杂的数据。所以我编写了一个基于递归反射的 JSON 生成器,它接受任何托管类或结构,并生成浏览器可以理解的 JSON 字符串。

因为此引擎在类中搜索字段,所以**无需编写此类属性**

public int Id
{
    get { return this._id; }
    set { this._id = value; }
}

您可以选择所有字段,也可以使用属性标记特定字段,然后仅将它们发送到 JavaScript 代码。

更重要的是,该引擎甚至可以处理 .NET 3.5 特有的匿名类型(如上图所示)。似乎匿名类型与程序集的 DLL 中的适当类型存储方式不同。

Using the Code

使用该代码非常简单:使用一行 C# 代码即可将对象“转换”为发送到客户端代码的 JSON 字符串。无需辅助类(如类型序列化程序)。

客户端代码使用一行 eval 代码来创建 DOM 对象。

就是这样。 在 .NET 3.5 中,您甚至不必编写带有复杂构造函数的类来接收所有数据作为参数(就像 .NET 2.0 中那样)。

该引擎可以处理原始数据类型(数值类型、字符串和日期)、类、结构、数组和空字段。 如果您的某些数据在自定义集合(如泛型列表)中,则可以使用ToArray()方法以引擎可以理解的形式获取。 我选择使用 array(s) 而不是 IEnumerable(s),因为您可能有一个实现 IEnumerable 的类,但您可能不想将其视为集合(string 就是这样一个类)。

我知道此引擎的全部意义在于隐藏对象的表示,但这是一个它看起来如何的示例(只是为了有一个想法)。

{
    'date' : new Date( 2008, 1, 23, 8, 5, 52 ) ,
    'Name' : 'some string' ,
    'StringSpecial' : '\\some \' \" string' ,
    'NullString' : null ,
    'Private' : null ,
    'i' : -1 ,
    'f' : 2.3 ,
    't2' :
    {
        'd' : 3.14 ,
        'D' : 3.15 ,
        'ThisIsAStruct' :
        {
            'str' : 'string in a struct'
        }
    }
}

既然您已经了解了情况,请前往下载存档并试用。

有一个 Visual Studio 2005 和一个 Visual Studio 2008 解决方案。 最后一个包含一个 .NET 3.5 ASP 示例,用于测试我所吹嘘的匿名类型。

如果您查看生成器的代码,您会注意到它甚至没有 200 行代码长。

PS:不要忘记将 Web 项目设置为 Visual Studio 中的“启动项目”。

历史

  • 2008 年 2 月 23 日 - 初始版本
  • 2009 年 2 月 16 日 - 新代码版本
© . All rights reserved.