jquery ajax调用返回JSON解析错误

我使用jquery调用ajax wcf方法,该方法返回一个对象列表作为JSON字符串。 在fiddler2(在TextView中)检查时,JSON字符串如下所示:

{"d":"[{\"ID\":\"6b2b8c62-31ce-4df2-982b-054ff5f6be72\",\"Name\":\"Carol\",\"Surname\":\"IrishWife\"},{\"ID\":\"d254740a-0a0f-4a1e-9e4f-0812227dd5af\",\"Name\":\"Willie\",\"Surname\":\"Le Roux\"},{\"ID\":\"660bf0dd-436a-4588-a9c0-19fd6fdcee23\",\"Name\":\"Emmas\",\"Surname\":\"Mum\"},{\"ID\":\"6b9403c5-b728-4e96-bcb1-203e7472eec3\",\"Name\":\"Owen\",\"Surname\":\"Lima\"},{\"ID\":\"d52c08fb-4418-4600-960f-243ff4443ee6\",\"Name\":\"Tim\",\"Surname\":\"Lee\"},{\"ID\":\"e2aacf5b-8855-44ce-9338-3d39f8ab3349\",\"Name\":\"Marcello\",\"Surname\":\"MT\"},{\"ID\":\"578be087-8385-46d6-89de-3db31d352cbc\",\"Name\":\"Carlyn\",\"Surname\":\"Homegroup\"},{\"ID\":\"4c805825-2bee-447a-8b75-41ead17db33e\",\"Name\":\"George\",\"Surname\":\"Homegroup\"},{\"ID\":\"ae48804f-5e78-42c8-9ba0-4214c98a5a89\",\"Name\":\"Isla\",\"Surname\":\"Le Roux\"},{\"ID\":\"f8be2f4f-fedb-4863-8a84-44fddea84ea9\",\"Name\":\"Peter\",\"Surname\":\"Anderson\"},{\"ID\":\"15e7644d-ec43-44ff-a959-47e00112da6b\",\"Name\":\"Kitty\",\"Surname\":\"Corbett\"},{\"ID\":\"8fd7fccc-335c-4d5c-93b5-4b00f96a9950\",\"Name\":\"Natalie\",\"Surname\":\"Archibald\"},{\"ID\":\"09b5aad2-2cf1-488a-962b-4d692b05ddea\",\"Name\":\"Miku\",\"Surname\":\"Heally\"},{\"ID\":\"affa369e-5af3-4537-a0f4-71422956da41\",\"Name\":\"Steven\",\"Surname\":\"Corbett\"},{\"ID\":\"65f57da3-4f88-4798-9590-83b4ccecfc44\",\"Name\":\"Tim\",\"Surname\":\"Archibald\"},{\"ID\":\"53bfb451-f66f-4b6e-b430-8d13c95b30d8\",\"Name\":\"Philip\",\"Surname\":\"MT\"},{\"ID\":\"c7f22b9b-4030-4f82-9f75-bbb726cabb73\",\"Name\":\"Vincent\",\"Surname\":\"Van Der Walt\"},{\"ID\":\"232577be-3165-4316-a20d-c2f2a09c5382\",\"Name\":\"Scott\",\"Surname\":\"Lynn\"},{\"ID\":\"913508a1-5dca-4504-8caf-c8e3dc386fc0\",\"Name\":\"Dan\",\"Surname\":\"MT\"},{\"ID\":\"36054a07-b14d-4c1c-b35f-e00875dde7e5\",\"Name\":\"Sarah\",\"Surname\":\"MT\"},{\"ID\":\"f14e7d98-e040-4ba9-928f-f2ff48116b0b\",\"Name\":\"Josh\",\"Surname\":\"IrishDude\"}]"} 

当我在fiddler的JSON视图中检查结果时,它显示以下JSON:

 d=[{"ID":"6b2b8c62-31ce-4df2-982b-054ff5f6be72","Name":"Carol","Surname":"IrishWife"},{"ID":"d254740a-0a0f-4a1e-9e4f-0812227dd5af","Name":"Willie","Surname":"Le Roux"},{"ID":"660bf0dd-436a-4588-a9c0-19fd6fdcee23","Name":"Emmas","Surname":"Mum"},{"ID":"6b9403c5-b728-4e96-bcb1-203e7472eec3","Name":"Owen","Surname":"Lima"},{"ID":"d52c08fb-4418-4600-960f-243ff4443ee6","Name":"Tim","Surname":"Lee"},{"ID":"e2aacf5b-8855-44ce-9338-3d39f8ab3349","Name":"Marcello","Surname":"MT"},{"ID":"578be087-8385-46d6-89de-3db31d352cbc","Name":"Carlyn","Surname":"Homegroup"},{"ID":"4c805825-2bee-447a-8b75-41ead17db33e","Name":"George","Surname":"Homegroup"},{"ID":"ae48804f-5e78-42c8-9ba0-4214c98a5a89","Name":"Isla","Surname":"Le Roux"},{"ID":"f8be2f4f-fedb-4863-8a84-44fddea84ea9","Name":"Peter","Surname":"Anderson"},{"ID":"15e7644d-ec43-44ff-a959-47e00112da6b","Name":"Kitty","Surname":"Corbett"},{"ID":"8fd7fccc-335c-4d5c-93b5-4b00f96a9950","Name":"Natalie","Surname":"Archibald"},{"ID":"09b5aad2-2cf1-488a-962b-4d692b05ddea","Name":"Miku","Surname":"Heally"},{"ID":"affa369e-5af3-4537-a0f4-71422956da41","Name":"Steven","Surname":"Corbett"},{"ID":"65f57da3-4f88-4798-9590-83b4ccecfc44","Name":"Tim","Surname":"Archibald"},{"ID":"53bfb451-f66f-4b6e-b430-8d13c95b30d8","Name":"Philip","Surname":"MT"},{"ID":"c7f22b9b-4030-4f82-9f75-bbb726cabb73","Name":"Vincent","Surname":"Van Der Walt"},{"ID":"232577be-3165-4316-a20d-c2f2a09c5382","Name":"Scott","Surname":"Lynn"},{"ID":"913508a1-5dca-4504-8caf-c8e3dc386fc0","Name":"Dan","Surname":"MT"},{"ID":"36054a07-b14d-4c1c-b35f-e00875dde7e5","Name":"Sarah","Surname":"MT"},{"ID":"f14e7d98-e040-4ba9-928f-f2ff48116b0b","Name":"Josh","Surname":"IrishDude"}] 

所以fiddler可以成功解析它,但在客户端上,jquery ajax错误回调函数显示以下错误:

 Error: No conversion from text to application/json 

wcf方法定义如下:

  [OperationContract] [WebGet(ResponseFormat=WebMessageFormat.Json)] public string GetPeople(Guid groupId) { using (SchedulerContext context = new SchedulerContext()) { JavaScriptSerializer ser = new JavaScriptSerializer(); var query = from p in context.People where p.Group_ID == groupId select new { p.ID, p.Name, p.Surname }; return ser.Serialize(query.ToArray()); } } 

最后,调用jquery是:

 $.ajax( { type: "GET", dataType: "application/json", contentType: "json", data: { groupId: 'ae09a080-5d7c-4e92-9a87-591574b7c4b8' }, url: "WebAPI.svc/GetPeople", error: function (jqXHR, textStatus, errorThrown) { alert("error"); }, success: function (msg) { alert(msg.d[0].Name); } } ); 

提前致谢!

更新:感谢@ user1370958,更接近解决方案。

将错误回调函数更改为以下内容时,它会成功返回结果…

 error: function (jqXHR, textStatus, errorThrown) { var test = $.parseJSON(jqXHR.responseText); var test2 = $.parseJSON(test.d); alert(test2[0].Name); }, 

不知道为什么,但我必须解析结果,然后解析其中的嵌套对象。 我假设如果我返回的任何类型包含复杂的对象,它还需要另一个解析…

这里, "application/json"不是dataType属性的有效值。 我在项目中将其更改为"json" ,同样的问题也解决了。

请在此查看详细信息(评论#7): http : //bugs.jquery.com/ticket/8216

尝试在服务器端代码中添加MIME类型:

 Response.ContentType = "application/json"; 

使用WCF 4.0 ,您可以添加名为automaticFormatSelectionEnabled的属性,该属性允许服务查看HTTP请求中的Accept标头以确定要返回的格式。 只要您返回的内容是可序列化的,WCF将为您处理正确的序列化。 在你的jQuery ajax调用中,通过包括accepts: {json: "application/json"}来添加Accept头accepts: {json: "application/json"}

我假设您要将ser.Serialize(query.ToArray())的值返回给客户端(数组)。 但是你将它作为字符串返回,因此WCF会将JSON转换为字符串,你最终会得到的不是数组,而是字符串。

由于您使用的是WCF本身不支持的匿名类型,因此您需要使用JavaScriptSerializer 。 因此,为了防止JSON的双重编码(进入字符串),您应该将数据作为Stream返回,以便WCF不会触及您的数据(请参阅下面的示例代码)。

还有一件事:我看到你的响应有一个{"d":...}包装器,这表明你在定义服务/端点时正在使用 / WebScriptEnablingBehavior / WebScriptServiceHostFactory 。 由于您没有使用ASP.NET AJAX库,因此您不需要包装,因此您可以使用“更简单”的 / WebHttpBehavior / WebServiceHostFactory ,而您的响应将不会包含在“ d“对象。

 [OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Json)] public System.IO.Stream GetPeople(Guid groupId) { using (SchedulerContext context = new SchedulerContext()) { JavaScriptSerializer ser = new JavaScriptSerializer(); var query = from p in context.People where p.Group_ID == groupId select new { p.ID, p.Name, p.Surname }; string json = ser.Serialize(query.ToArray()); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) { WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; return ms; } } 

我找到了一个解决方法:

第一个问题是实体模型上的循环引用exception。 为了解决这个问题,我使用以下代码从上下文中分离我的实体,然后将它们序列化为字符串。 然后我使用下面的代码在客户端上对它们进行序列化。

服务

  [WebGet(ResponseFormat = WebMessageFormat.Json)] [OperationContract] public string[] GetPeople(Guid groupId) { using (SchedulerContext context = new SchedulerContext()) { var people = (from p in context.People where p.Group_ID == groupId select p).ToList(); JavaScriptSerializer ser = new JavaScriptSerializer(); string[] result = new string[people.Count]; for (int i = 0; i 

客户

  $.ajax( { type: "GET", //dataType: "application/json", //dataType: "text/plain", contentType: "json", data: { groupId: 'ae09a080-5d7c-4e92-9a87-591574b7c4b8' }, //data: { groupId: 'test' }, //data: { groupId: '739526F1-7C58-4E3B-97D8-4870948BFE32' }, url: "WebAPI.svc/GetPeople", error: function (jqXHR, textStatus, errorThrown) { alert(jqXHR.resultText); }, success: function (people) { //the returned param "people" is of type string[], so each string needs parsed $(people).each(function (index, value) { var person = $.parseJSON(value); //now I can use the Person object }); } } );