我正在使用JQuery和WebMethod在我的数据库中发送和存储JSON对象的字符串表示。
以同样的方式,我有另一个WebMethod应该从数据库中取回用户设置并将其返回给请求客户端:
[WebMethod]
public static string GetUserSettings()
{
FacebookWebContext currentFbContext = FacebookWebContext.Current;
string encodedSettings = "{}";
if (currentFbContext.IsAuthorized(ExtendedPermissions))
{
// Methods to fetch json back from the database into "encodedSettings"
}
return encodedSettings;
}
一切顺利,但问题是当我“嗅”http响应时,响应就像这样包装:
{"d":"my_stored_json_object_as_an_escaped_string"}
这很好,但由于返回类型设置为“string”,所以在“和其他转义字符之前,用”\“字符跳过整个存储的json,因此我可以' t在客户端使用它作为javascript对象。
我尝试过这样的事情:
$.ajax({
type: "POST",
url: "Ajax/Default.aspx/GetUserSettings",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (usrSettingsObj) {
var obj = eval(usrSettingsObj.d);
}});
但它会引发错误。
任何想法如何克服这个问题?
答案 0 :(得分:1)
我怀疑问题是eval()
将您的JSON视为范围声明而不是哈希对象。解决这个问题的简单方法就是这个
var obj = eval('('+usrSettingsObj.d+')');
虽然我仍然宁愿将你的返回值从web方法修改为实际的JSON。
如果没有,则发布您的实际回复,以便更容易理解发生了什么。
编辑:
就像我说的那样,eval()
对你给它的字符串的性质感到困惑。它看到{
并认为它是一个范围大括号,然后尝试将其余部分作为单独的语句进行评估,这当然是无效的。基本上它需要一些帮助来理解你给它的字符串是一个哈希对象。你可以通过在大括号中包装来创建所谓的填充JSON,如上所示。
或者您可以将其重写为eval('obj = ('+usrSettingsObj.d+')');
,这应该具有相同的效果。实际上在最后一种情况下你甚至不需要牙箍。只需eval('obj = '+usrSettingsObj.d);
即可。
哦,最重要的是:使用eval()
来解析JSON通常是不受欢迎的。您应该尽可能使用实际的JSON解析器。我相信jQuery有parseJSON()
方法。