Jquery 如何使用C#字符串生成器生成简单的JSON对象
我是JSON新手,希望使用StringBuilder创建简单的JSON对象,该对象将由jQueryAjax调用查询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
[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);
}
});