jQuery 中 $.getJSON() 和 $.ajax() 的区别

Posted

技术标签:

【中文标题】jQuery 中 $.getJSON() 和 $.ajax() 的区别【英文标题】:Difference Between $.getJSON() and $.ajax() in jQuery 【发布时间】:2010-11-07 17:47:54 【问题描述】:

我正在调用 ASP.NET MVC 操作

public JsonResult GetPatient(string patientID)

...

来自使用 jQuery 的 javascript。以下调用有效

$.getJSON(
'/Services/GetPatient',
 patientID: "1" ,
function(jsonData) 
  alert(jsonData);
);

而这个没有。

$.ajax(
  type: 'POST',
  url: '/Services/GetPatient',
  data:  patientID: "1" ,
  contentType: 'application/json; charset=utf-8',
  dataType: 'json',
  success: function(jsonData) 
    alert(jsonData);
  ,
  error: function() 
    alert('Error loading PatientID=' + id);
  
);

两者都达到了操作方法,但在 $.ajax 调用下,患者 ID 值为 null。我想将 $.ajax 调用用于一些高级回调。

任何想法表示赞赏。

【问题讨论】:

【参考方案1】:

内容类型

您无需在调用 MVC 控制器操作时指定该内容类型。只有在调用 ASP.NET AJAX“ScriptServices”和页面方法时才需要特殊的“application/json; charset=utf-8”内容类型。 jQuery 的默认 contentType “application/x-www-form-urlencoded” 适合请求 MVC 控制器操作。

在此处了解有关该内容类型的更多信息:JSON Hijacking and How ASP.NET AJAX 1.0 Avoids these Attacks

数据

数据正确的。通过向 jQuery 传递一个 JSON 对象,正如您所拥有的,它将在 POST 数据中序列化为 patientID=1。这种标准形式是 MVC 期望参数的方式。

当您使用 ASP.NET AJAX 服务时,您只需将参数用引号括起来,例如“ 'patientID' : 1 ”。他们希望解析出表示 JSON 对象的单个字符串,而不是 POST 数据中的各个变量。

JSON

在这种特定情况下这不是问题,但养成在 JSON 对象中引用任何字符串键或值的习惯是个好主意。如果您无意中将 JavaScript 保留关键字用作对象中的键或值,而没有引用它,则会遇到令人困惑的调试问题。

相反,您不必引用数字或布尔值。直接在对象中使用它们总是安全的。

因此,假设您确实想要 POST 而不是 GET,您的 $.ajax() 调用可能如下所示:

$.ajax(
  type: 'POST',
  url: '/Services/GetPatient',
  data:  'patientID' : 1 ,
  dataType: 'json',
  success: function(jsonData) 
    alert(jsonData);
  ,
  error: function() 
    alert('Error loading PatientID=' + id);
  
);

【讨论】:

谢谢。这解决了问题。我使用 $.compactJSON() 将 JS 对象格式化为 JSON 作为数据选项。 由于 $.compactJSON 在 jQuery 中不再可用,我在此插件中使用了 $.toJSON:code.google.com/p/jquery-json【参考方案2】:

.getJson 只是 .ajax 的一个包装器,但它提供了一个更简单的方法签名,因为某些设置是默认设置的,例如 dataType 为 json,类型为 get 等

注意,.load、.get 和 .post 也是 .ajax 方法的简单包装器。

【讨论】:

【参考方案3】:

替换

data:  patientID: "1" ,

data: " 'patientID': '1' ",

延伸阅读:3 mistakes to avoid when using jQuery with ASP.NET

【讨论】:

那不是必须像 data: ' patientID: "1" ',以避免嵌套双引号吗? 不行。此更改的操作方法中的值为 null。 尝试删除您指定的 contentType 设置 我认为方法参数必须与 JSON 键相同。即个人ID。除此之外,我不确定问题所在,因为我已经多次使用此语法并且它没有问题。 必须手动执行此操作很糟糕,因此我建议使用code.google.com/p/jquery-json - 这可以让您使用 $.compactJSON() 方法包装您的真实 JSON 对象,该方法会自动将对象作为字符串发送,全面减少头痛。【参考方案4】:

jquery 的一些函数如 $.ajax、$.get、$.post、$.getScript、$.getJSON 有很多混淆,它们之间有什么区别,哪个是最好的,哪个是快速,使用哪个以及何时使用下面是它们的描述,以使它们清晰并摆脱这种类型的混淆。

$.getJSON() 函数是一个简写的 Ajax 函数(内部使用 $.get() 和数据类型脚本),相当于下面的表达式,使用一些有限的标准,例如请求类型是 GET,数据类型是 json。

阅读更多 ..jquery-post-vs-get-vs-ajax

【讨论】:

有人删除了链接,没有它这个答案毫无意义,所以我把它回滚了。【参考方案5】:

我看到的唯一区别是 getJSON 执行的是 GET 请求而不是 POST。

【讨论】:

尝试将类型改为GET,rpcutts answer中的数据发生变化,但action方法中的值仍然为null。【参考方案6】:
contentType: 'application/json; charset=utf-8'

不好。至少它对我不起作用。其他语法没问题。您提供的参数格式正确。

【讨论】:

【参考方案7】:

使用 $.getJSON()) 没有任何错误回调,只有您可以跟踪成功回调,并且不支持诸如 beforeSend、statusCode、mimeType 等标准设置,如果您希望使用 $.ajax()。

【讨论】:

以上是关于jQuery 中 $.getJSON() 和 $.ajax() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

getjson jquery解析数组

深入理解jQuery中$.get$.post$.getJSON和$.ajax的用法

jQuery $.getJSON 和遍历数组正在倾尽全力

理解jQuery中$.get$.post$.getJSON和$.ajax的用法

jQuery:请求 getJSON + SunlightLabs API 帮助

jQuery中$.getJSON