JSON 和 JSONP 有什么区别?

IT技术 json jsonp javascript
2021-01-19 18:34:55

格式明智,文件类型明智和实际使用明智?

6个回答

JSONP 是带有填充的 JSON。也就是说,您将一个字符串放在开头,并在其周围放置一对括号。例如:

//JSON
{"name":"stackoverflow","id":5}
//JSONP
func({"name":"stackoverflow","id":5});

结果是您可以将 JSON 作为脚本文件加载。如果您之前设置了一个名为 的函数func,那么当脚本文件加载完成后,该函数将使用一个参数调用,即 JSON 数据。这通常用于允许使用 JSON 数据进行跨站点 AJAX。如果您知道 example.com 正在提供类似于上面给出的 JSONP 示例的 JSON 文件,那么您可以使用这样的代码来检索它,即使您不在 example.com 域中:

function func(json){
  alert(json.name);
}
var elm = document.createElement("script");
elm.setAttribute("type", "text/javascript");
elm.src = "http://example.com/jsonp";
document.body.appendChild(elm);
也许有点晚了,但是我想为其他人回答您的问题,不,如果您使用 JSONP,您将忽略所有 CORS 优势(我之所以称之为优势,是因为安全问题。)我建议您正确实施 CORS,这将帮助您解决安全问题以及更好的架构方法。
2021-03-16 18:34:55
假设您可以配置 CORS 以允许跨源请求,JSONP 是否还有意义?
2021-04-09 18:34:55

基本上,由于同源策略,您不允许通过 AJAX 从另一个域请求 JSON 数据。AJAX 允许您在页面加载后获取数据,然后在返回后执行一些代码/调用函数。我们不能使用 AJAX,但我们可以将<script>标记注入我们自己的页面,并且这些标记可以引用托管在其他域的脚本。

通常,您会使用它来包含来自 CDN 的库,例如jQuery但是,我们可以滥用它并使用它来获取数据!JSON 已经是有效的 JavaScript(在大多数情况下),但我们不能只在我们的脚本文件中返回 JSON,因为我们无法知道脚本/数据何时完成加载,我们也无法访问它,除非它是分配给变量或传递给函数。所以我们要做的是告诉 Web 服务在它准备好时代表我们调用一个函数。

例如,我们可能会从证券交易所 API 请求一些数据,并连同我们常用的 API 参数一起给它一个回调,例如?callback=callThisWhenReady. Web服务,然后包装我们的函数的数据并返回它是这样的:callThisWhenReady({...data...})现在只要脚本加载,您的浏览器就会尝试执行它(正常情况下),它依次调用我们的任意函数并向我们提供我们想要的数据。

它的工作方式与普通的 AJAX 请求非常相似,只是我们必须使用命名函数而不是调用匿名函数。

jQuery 实际上通过为您创建一个唯一命名的函数并将其传递给您来无缝地支持这一点,然后它将运行您想要的代码。

FWIW:@SamVloeberghs - 说 JSON 代表一个 javascript 对象有点误导。它可以是来自任何语言或数据库的任何数据,可以表示为名称-值对和数组。并且需要额外的约定来准确地往返任何JS 对象 - 请参阅JSON: Unsupported native data types值得注意的是,JS Date 作为字符串返回到远端。weblog.west-wind.com/posts/2014/jan/06/...
2021-03-13 18:34:55
和什么分开?JSON 也不是一种语言
2021-03-20 18:34:55
或更易读:JSON:“文本符号”中的 javascript 对象。就像你会 toString() 一个 Java 对象?
2021-03-21 18:34:55
@nickf:是的......我正在寻找正确的词......那你会怎么称呼它?根据 json.org 的“数据交换格式”。
2021-03-31 18:34:55

JSONP允许您指定传递给您的 JSON 对象的回调函数。这允许您绕过同源策略并将 JSON 从外部服务器加载到您网页上的 JavaScript 中。

JSONP 代表“带填充的 JSON”,它是一种从不同域加载数据的解决方法。它将脚本加载到 DOM 的头部,因此您可以访问信息,就像它加载到您自己的域中一样,从而绕过跨域问题。

jsonCallback(
{
    "sites":
    [
        {
            "siteName": "JQUERY4U",
            "domainName": "http://www.jquery4u.com",
            "description": "#1 jQuery Blog for your Daily News, Plugins, Tuts/Tips &amp; Code Snippets."
        },
        {
            "siteName": "BLOGOOLA",
            "domainName": "http://www.blogoola.com",
            "description": "Expose your blog to millions and increase your audience."
        },
        {
            "siteName": "PHPSCRIPTS4U",
            "domainName": "http://www.phpscripts4u.com",
            "description": "The Blog of Enthusiastic PHP Scripters"
        }
    ]
});

(function($) {
var url = 'http://www.jquery4u.com/scripts/jquery4u-sites.json?callback=?';

$.ajax({
   type: 'GET',
    url: url,
    async: false,
    jsonpCallback: 'jsonCallback',
    contentType: "application/json",
    dataType: 'jsonp',
    success: function(json) {
       console.dir(json.sites);
    },
    error: function(e) {
       console.log(e.message);
    }
});

})(jQuery);

现在我们可以使用 JSONP 和我们围绕 JSON 内容创建的回调函数通过 AJAX 请求 JSON。输出应该是作为对象的 JSON,然后我们可以不受限制地将数据用于任何我们想要的。

JSONP 本质上是带有额外代码的 JSON,就像围绕数据的函数调用。它允许在解析期间对数据进行操作。