Jquery 如何使用C#字符串生成器生成简单的JSON对象

Jquery 如何使用C#字符串生成器生成简单的JSON对象,jquery,asp.net,json,Jquery,Asp.net,Json,我是JSON新手,希望使用StringBuilder创建简单的JSON对象,该对象将由jQueryAjax调用查询 [WebMethod] public static string GetmyJSON() { StringBuilder sb = new StringBuilder(); sb.Append("{firstname: \"Manas\",").Append("lastname : \"Tunga\"").Append("}"); return

我是JSON新手,希望使用StringBuilder创建简单的JSON对象,该对象将由jQueryAjax调用查询

[WebMethod]
public static string GetmyJSON()
{
    StringBuilder sb = new StringBuilder();       
    sb.Append("{firstname: \"Manas\",").Append("lastname : \"Tunga\"").Append("}");
    return sb.ToString();    

}
在我的客户端代码中,我有:

.ajax({

        type: "POST",
        url: "simplePage.aspx/GetmyJSON",           
        data: "{}",
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',

        success: function (data) {

            alert(data.d.firstname);             


        } // end of sucess

    }); // End of ajax
但我的警告信息显示“未定义”而不是“法力”。
是否可以使用StringBuilder返回JSON对象?

永远不要这样做从不手动构建JSON始终使用JSON序列化程序。或者在您的情况下,您甚至不需要这样做,因为ASP.NET webmethod运行时将负责。您所要做的就是关注您的业务需求,而不必担心管道问题

var lstMes = new List<Person>();

            System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
             new System.Web.Script.Serialization.JavaScriptSerializer();
                string sJSON = oSerializer.Serialize(lstMes);
                return sJSON;
例如,首先定义一个表示数据的模型:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
然后让web方法返回此模型,将所有序列化问题留给框架:

[WebMethod]
public static Person GetPerson()
{
    Person p = new Person();
    p.FirstName = "Manas";
    p.LastName = "Tunga";
    return p;
}
现在只需从客户端使用此方法:

$.ajax({
    type: 'POST',
    url: 'simplePage.aspx/GetPerson',
    data: '{ }',
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data.d.FirstName);
        alert(data.d.LastName);
    }
});
无需担心JSON、字符串生成器

如果需要,还可以将复杂参数传递给web方法:

public class Foo
{
    public string Bar { get; set; }
}
然后:

[WebMethod]
public static Person GetPerson(Foo foo)
{
    ...
}
最后:

$.ajax({
    type: 'POST',
    url: 'simplePage.aspx/GetPerson',
    data: JSON.stringify({ foo: { bar: 'baz' } }),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data.d.FirstName);
        alert(data.d.LastName);
    }
});

这里显示的
JSON.stringify
方法是内置于现代浏览器中的。如果您需要支持传统浏览器,您可以将脚本包含到页面中。

严格回答这个问题——是的,您可以从.NET方法返回您想要的任何内容。正如@canon在对这个问题的评论中所说的,您的问题可能是您必须包装属性名称


这说明了为什么“正确”的答案(如前所述:,)是使用现有的序列化程序,如(如果需要手动序列化)或让.NET处理它(如在最“最近”的迭代中所做的那样)通过返回对象本身。

您可以构建适当的.net对象,该对象封装您要发送回的数据,并通过一些库(如JSON.net)将其编译为JSON。如果你想要一些内置技术,那么对DataContractSerializer做一些研究。如果你坚持这样做,以太将
\“
更改为
\”
,以太将其更改为
\\”
必须引用JSON属性名称,即:
{“id”:10}
如果我坚持让您使用string builder手动创建JSON,您会怎么做。我想知道我的错误在哪里,你不能坚持用字符串手动构建JSON这样的错误。错的是你采取的方法。问题是您正在从web方法返回一个字符串。因此,在成功处理程序中,如果要访问该字符串,需要将其解析回对象,如
alert($.parseJSON(data.d).firstname)。但是,请,哦,请向我保证你永远不会做那样的事情。@DarinDimitrov,你有足够的权威来相信你,并消除我对性能的担忧,但我仍然很好奇为什么它不好,为什么BCL中没有与StringBuilder、XmlWriter、HtmlTextWriter类似的本机JsonBuilder类。为什么所有这些都是好的,但是JsonBuilder是邪恶的?假设我需要创建5个属性的简单对象,但是只有在满足某些条件时才应该定义某些属性。在这种情况下定义模型层次结构太复杂了,我将使用dynamic或Dictionary。这会有点影响表演。。。
$.ajax({
    type: 'POST',
    url: 'simplePage.aspx/GetPerson',
    data: JSON.stringify({ foo: { bar: 'baz' } }),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        alert(data.d.FirstName);
        alert(data.d.LastName);
    }
});