在做一个关于搜索功能时用到了jquery autocomplete,发现返回数据时都用到了一个.d,比如:

var datas = eval('(' + msg.d + ')');

这个.d是什么呢,直接输出调用的方法,字符串里是没有d属性的,遂百思不得其解,后来找到了一篇文章,转载记下:

由于.net frameword3.5以上添加了对contenttype的检查,当ajax发送请求时,如果设置了contenttype为json,那么请求webservice时,会自动将返回的内容转为json的格式,json的格式iruxia
{"d":"webservice方法返回的字符串内容"}

这时出现一个问题了,如果方法返回的是一个json格式的字符串,那么如何获得实际的json对象,而不是只有一个属性d的json对象呢?

其实很简单,我们只需要在success回调函数中eval下jquery通过获取webservice得到的json对象的d属性,就可以获取到实际的json对象了。

如下,如果方法返回的是 {"msg":"其实我也是json对象的字符串"} 这种信息,我们如何获取到msg这个属性的值呢?

首先一定要明确的时,调用webservice的方法后实际获取到的json格式的字符串是这样的 {"d":"{"msg":"其实我也是json对象的字符串"}"} ,jquery通过这个字符串生成的json对象只有一个属性,那就是d,d存储的是webservice方法返回的json格式的字符串信息,而不是json对象,所以不能通过 obj.d.msg来获取msg信息。而是需要 var realobj=eval('('+o.d+')')来生成实际的json对象,然后realobj.msg才是需要的信息。

using System.Web.Script.Services;
using System.Web.Services;
namespace WebService35
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod]
public string method1()
{
return "非json字符串";//实际返回的json格式的字符串为 {"d":"非json字符串"}
}
[WebMethod]
[ScriptMethod(UseHttpGet]
public string method2()
{
return "{\"msg\":\"其实我也是json对象的字符串\"}"; //实际返回的json格式的字符串为 {"d":"{"msg":"其实我也是json对象的字符串"}"}
}
}
} //调用method1,返回非json格式的字符串,所以不需要eval
$.ajax({
url: "test.asmx/method1",
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: "{}",
success: function(json){alert("Success:"+json.d); },
error: function(x, e) {alert("Error:"+x.responseText); }, //============================
complete: function(x) { alert("Complete:"+x.responseText);}
}); //调用method2,返回json格式的字符串,所以需要eval jquery生成的json对象的d属性来生成实际的json对象
$.ajax({
url: "test.asmx/method2",
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: "{}",
success: function(json){
var realobj=eval('('+josn.d+')');
alert("Success:"+realobj.msg);
}, //============================
error: function(x, e) {alert("Error:"+x.responseText); },
complete: function(x) { alert("Complete:"+x.responseText);}
});

题记:通过chrome的调试功能,是可以看到ajax过来的数据中含有d的,只是直接输出没有。如:

{"d":"[{\"name\":\"深发展A\",\"code\":\"000001\",\"spell\":\"sfza\",\"count\":\"32435\"},{\"name\":\"万科A\",\"code\":\"000002\",\"spell\":\"wka\",\"count\":\"231\"}]"}

另外,jquery autocomplete和jquery ui autocomplete是两个不同的库,估计不少人会把他们混为一谈。

json的eval为什么要用msg.d的更多相关文章

  1. JSON中eval与parse的区别

    json的的解析方法 (非原创) json的解析方法共有两种:eval_r() 和 JSON.parse(),使用方法如下: var jsonData = '{"data1":&q ...

  2. Js中把JSON字符串转换为JSON对象(eval()、new Function())

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...

  3. 换行符在ajax中返回json,eval时发生的 Unexpected token ILLEGAL

    用户如果输入了换行在数据中记录为‘空格’,但不是真正的空格. 程序前台采用ajax和json返回数据绑定时会 出现 Unexpected token ILLEGAL 例子: 在sql中存储为下图 在“ ...

  4. JSON.parse() JSON.stringify() eval() jQuery.parseJSON() 的区别

    http://www.jb51.net/article/81880.htm    :   jQuery.parseJSON(jsonString) : 将格式完好的JSON字符串转为与之对应的Java ...

  5. Python txt文件读取写入字典的方法(json、eval)

    link:https://blog.csdn.net/li532331251/article/details/78203438 一.使用json转换方法 1.字典写入txt import json d ...

  6. JSON.stringify(),JSON.parse(),eval(string)

      JSON.stringify()用于从一个对象解析出字符串 : var obj = {"name":"week","age":" ...

  7. js里json和eval()

    JSON * - JS中的对象只有JS自己认识,其他的语言都不认识 * - JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别, * 并且可以转换为任意语言中的对象,JSON在开发中主 ...

  8. Python中json和eval的区别

    >>> import json >>> s = '{"one":1,"two":2}' >>> json. ...

  9. json解析eval()中文乱码问题的解决

    只需要后台post请求中添加: resp.setContentType("text/html;charset=utf-8"); req.setCharacterEncoding(& ...

随机推荐

  1. ural 1433. Diamonds

    1433. Diamonds Time limit: 1.0 secondMemory limit: 64 MB Sasha is lucky to have a diamond in the for ...

  2. 2015ACM/ICPC亚洲区长春站 L hdu 5538 House Building

    House Building Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  3. 【转载】Linux下makefile详解--跟我一起写 Makefile

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  4. BZOJ4342 : CF348 Pilgrims

    可以发现,每个特殊点可以贡献的部分在树上是一条链. 设三元组(v,x,y)表示路径长度,需要更新的端点,与当前点的lca为y. 对于每个节点x,通过两遍树形DP可以求出: d[x]:x到x子树内的某个 ...

  5. CentOS6.4 配置Tengine

    1.安装Nginx所需的pcre-devel库 yum install -y gcc gcc-c++ wget ftp://ftp.csx.cam.ac.uk/pub/software/program ...

  6. 【C语言】04-函数

    一.函数的分类 前面已经说过,C语言中的函数就是面向对象中的"方法",C语言的函数可以大概分为3类: 1.主函数,也就是main函数.每个程序中只能有一个.也必须有一个主函数.无论 ...

  7. VTK 6 和 VTK 5 的不同

    Overview Replacement of SetInput() with SetInputData() and SetInputConnection() Removal of GetProduc ...

  8. Intent学习笔记

    Intent首先字面意思大概是意图.负责activity之间或者,activity与service等(我只知道这么点)之间信息的传递.就跟快递员起的作用差不多(我这这么理解),由一下六部分组成: Co ...

  9. java工程包的命名(-dev.jar,-javadoc.jar,jar)

    1.-javadoc.jar 这个应该是一个doc包,就是API,相当于帮助文档,用来说明类.方法.静态变量 都是干什么的. 2.-dev.jar,.jar都有可能包含源码,也可能都不包含

  10. Excel操作类

    '引入Excel的COM组件 Imports System Imports System.Data Imports System.Configuration Imports System.Web Im ...