从外部 URL 获取 JSON 数据并将其以纯文本形式显示在 div 中

Posted

技术标签:

【中文标题】从外部 URL 获取 JSON 数据并将其以纯文本形式显示在 div 中【英文标题】:Get JSON data from external URL and display it in a div as plain text 【发布时间】:2012-04-12 21:45:23 【问题描述】:

我有一个类似于https://www.googleapis.com/freebase/v1/text/en/bob_dylan 的外部资源,它返回一个 JSON。我想在 html 中的 div 中显示结果键的值(假设 div 的名称是“摘要”)。结果键的值也应该以纯文本形式显示。 URL返回json:

“结果”:“鲍勃·迪伦,原名罗伯特·艾伦·齐默尔曼,是美国人 创作型歌手、作家、诗人和画家,曾在 在流行音乐中占据了 5 年的时间。大部分迪伦最 著名的作品可以追溯到 1960 年代,当时他成为了......”

JSON 只有结果键,没有其他键 基本上我不想使用纯 HTML 和 javascript 以外的任何东西。我是 JavaScript 的相对初学者,因此我要求注释代码。

【问题讨论】:

这是一个相当基本的 HTML/AJAX 问题。到目前为止你有什么代码?你在哪里卡住?这是针对 AJAX 的 jQuery 文档,专门针对 JSON 数据执行 GET:api.jquery.com/jQuery.getJSON - 您可能会遇到的问题是同源策略,因为您将针对与您所在的域不同的域执行 AJAX 请求脚本正在运行。 当我们尝试使用 AJAX 从外部资源加载 JSON 数据时,可能会出现 CORS 错误 【参考方案1】:

这是一个不使用纯 JavaScript 的 JQuery。我使用了 javascript 承诺和 XMLHttpRequest 你可以在fiddle这里试试看

HTML

<div id="result" style="color:red"></div>

JavaScript

var getJSON = function(url) 
  return new Promise(function(resolve, reject) 
    var xhr = new XMLHttpRequest();
    xhr.open('get', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() 
      var status = xhr.status;
      if (status == 200) 
        resolve(xhr.response);
       else 
        reject(status);
      
    ;
    xhr.send();
  );
;

getJSON('https://www.googleapis.com/freebase/v1/text/en/bob_dylan').then(function(data) 
    alert('Your Json result is:  ' + data.result); //you can comment this, i used it to debug

    result.innerText = data.result; //display the result in an HTML element
, function(status)  //error detection....
  alert('Something went wrong.');
);

【讨论】:

旧版浏览器不支持 Promise。 在最新版本的 Chrome 中,“then”函数的第一部分有效,如果 url 正确,我会得到结果。但是,如果 url 不正确,我永远不会收到“出现问题”警报。也许这与 Fiddler 的工作方式有关? 任何版本的 Internet Explorer caniuse.com/#feat=promises 不支持 Promise,并且您不需要 简单 HTTP 请求的 Promise... 是的,但现在 Edge 是支持 Promises 的新浏览器。你可能不需要 Promises,但它是执行异步 JS 的新标准方式,所以为什么不编写简洁的脚本呢? @Abderrahim 抱歉,找不到该页面。你删除了这个问题吗?【参考方案2】:

您可以像这样使用 JSONP 执行此操作:

function insertReply(content) 
    document.getElementById('output').innerHTML = content;


// create script element
var script = document.createElement('script');
// assing src with callback name
script.src = 'http://url.to.json?callback=insertReply';
// insert script to document and load content
document.body.appendChild(script);

但源必须知道你希望它调用作为回调参数传递给它的函数。

使用 google API,它看起来像这样:

function insertReply(content) 
    document.getElementById('output').innerHTML = content;


// create script element
var script = document.createElement('script');
// assing src with callback name
script.src = 'https://www.googleapis.com/freebase/v1/text/en/bob_dylan?callback=insertReply';
// insert script to document and load content
document.body.appendChild(script);

检查将回调传递给 google api 时数据的外观: https://www.googleapis.com/freebase/v1/text/en/bob_dylan?callback=insertReply

这里对 JSONP 有很好的解释:http://en.wikipedia.org/wiki/JSONP

【讨论】:

【参考方案3】:

由于它是一个外部资源,您需要使用 JSONP,因为 Same origin policy。 为此,您需要添加查询字符串参数callback:

$.getJSON("http://myjsonsource?callback=?", function(data) 
    // Get the element with id summary and set the inner text to the result.
    $('#summary').text(data.result);
);

【讨论】:

OP 要求“纯 HTML 和 JavaScript” 前提是资源必须知道回调并对其进行调用【参考方案4】:

如果您想使用纯 javascript,但避免使用 Promise,您可以使用 Rami Sarieddine 的解决方案,但将 Promise 替换为回调函数,如下所示:

var getJSON = function(url, callback) 
    var xhr = new XMLHttpRequest();
    xhr.open('get', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() 
      var status = xhr.status;
      if (status == 200) 
        callback(null, xhr.response);
       else 
        callback(status);
      
    ;
    xhr.send();
;

你会这样称呼它:

getJSON('https://www.googleapis.com/freebase/v1/text/en/bob_dylan', function(err, data) 
  if (err != null) 
    alert('Something went wrong: ' + err);
   else 
    alert('Your Json result is:  ' + data.result);
    result.innerText = data.result;
  
);

【讨论】:

我在使用此解决方案的 Chrome 中收到“No 'Access-Control-Allow-Origin' header”错误。不适合我。 你是对的。这仅在服务器声明“Access-Control-Allow-Origin”标头并允许其他人访问其资源时才有效。否则,您必须使用 JSONP(如果服务器支持)或 CORS 代理服务器,它会下载数据并为您设置标头。【参考方案5】:

您可以使用 $.ajax 调用来获取值,然后将其放入您想要的 div 中。您必须知道的一件事是您无法接收 JSON 数据。你必须使用 JSONP。

代码是这样的:

function CallURL()  
    $.ajax(
        url: 'https://www.googleapis.com/freebase/v1/text/en/bob_dylan',
        type: "GET",
        dataType: "jsonp",
        async: false,
        success: function(msg)  
            JsonpCallback(msg);
        ,
        error: function()  
            ErrorFunction();
        
    );


function JsonpCallback(json)  
    document.getElementById('summary').innerHTML = json.result;

【讨论】:

它要显示在 div 中,但要创建 json 对象【参考方案6】:

使用 Robin Hartman 代码显示 Json 数据。您需要添加以下行。

他给你的代码给了你对象,对象。此代码以更好的方式检索数据。

result.innerText =JSON.stringify(data);

【讨论】:

他说,“我想在 html 的 div 中显示结果键的值”,而这正是我和 Rami Sarieddine 的代码所做的。您的代码将显示整个数据,这不是他想要的。【参考方案7】:

由于将从不同的域调用所需的页面,因此您需要返回 jsonp 而不是 json

$.get("http://theSource", callback : "?" , "jsonp",  function(data) 
    $('#summary').text(data.result);
);

【讨论】:

以上是关于从外部 URL 获取 JSON 数据并将其以纯文本形式显示在 div 中的主要内容,如果未能解决你的问题,请参考以下文章

以纯文本形式获取 pop3 邮件

PHP中的序列化或json?

通过AngularJS从外部URL获取文本[重复]

jquery以纯文本查找http元素并将其转换为链接

如何从 url 获取 json 数据并将其保存到 const 变量 [TypeScript]

C# http-get url JSON 数据并将其解析为文本..?