【问题标题】:How to make simple JSON object using C# string Builder如何使用 C# 字符串生成器制作简单的 JSON 对象
【发布时间】:2012-05-18 23:43:35
【问题描述】:

我是 JSON 新手,想使用 StringBuilder 制作简单的 JSON 对象,该对象将通过 jQuery Ajax 调用进行查询。

[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 对象?

【问题讨论】:

  • 您可以构建适当的 .net 对象,该对象封装您要发回的数据,并通过 JSON.Net 等库将它们转换为 JSON。如果您想要一些内置技术,请使用 DataContractSerializer 进行一些研究
  • 如果你坚持要这样,ether把\"改成',ether把它改成\\\"
  • JSON 属性名必须加引号,即:{"id":10}

标签: jquery asp.net json


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    例如,首先定义一个代表您的数据的模型:

    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 方法原生内置于现代浏览器中。如果您需要支持旧版浏览器,您可以将json2.js 脚本添加到您的页面中。

    【讨论】:

    • 如果我坚持你使用字符串生成器来手动创建 JSON 那么你会怎么做。我想知道我的错误在哪里
    • 你不能坚持像使用字符串手动构建 JSON 这样的错误。问题在于您采取的方法。问题是您正在从您的网络方法返回一个字符串。所以在你的成功处理程序中,如果你想访问它,你需要将这个字符串解析回一个对象,比如alert($.parseJSON(data.d).firstname);。但是请,哦,请向我保证,你永远不会做那样的事情。
    • @DarinDimitrov,您的权威足以相信您并消除我对性能的担忧,但我仍然很好奇为什么它不好以及为什么 BCL 中没有类似于 StringBuilder 的本机 JsonBuilder 类, XmlWriter,HtmlTextWriter。为什么所有这些都可以,但 JsonBuilder 是邪恶的?假设我需要创建 5 个属性的简单对象,但是只有在满足某些条件时才应该定义某些属性。为这种情况定义模型层次结构太复杂了——我将使用动态或字典。它会损害性能一点......
    【解决方案3】:
    var lstMes = new List<Person>();
    
                System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
                 new System.Web.Script.Serialization.JavaScriptSerializer();
                    string sJSON = oSerializer.Serialize(lstMes);
                    return sJSON;
    

    不要忘记添加参考:

    System.Web.Extensions.dll !!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2011-04-29
      • 2023-03-13
      相关资源
      最近更新 更多