31


我想从我自己的服务器加载一个 JSON 文件,其中包含一个数组到一个 javascript 对象变量中。
我想在页面加载开始时以同步方式执行此操作,因为在页面加载期间需要数据。

我设法使用了 jQuery.getJSON,但这是异步 ajax,看起来有点矫枉过正。

有没有办法在不进行自己解析的情况下以同步方式加载 JSON?
(或多或少像使用 a <script language="JavaScript" src="MyArray.json"></script>

在此先感谢您的帮助,因为我是 javascript 新手,所以希望它有意义。保罗

4

7 回答 7

37

getJSON()只是带有集合的ajax()函数的简写。dataType:'json'ajax()功能将让您自定义很多关于请求的内容。

$.ajax({
  url: 'MyArray.json',
  async: false,
  dataType: 'json',
  success: function (response) {
    // do stuff with response.
  }
});

您仍然使用回调,async:false但它会在从 ajax 调用继续执行之前触发。

于 2010-11-07T08:37:09.910 回答
15

干得好:

// Load JSON text from server hosted file and return JSON parsed object
function loadJSON(filePath) {
  // Load json file;
  var json = loadTextFileAjaxSync(filePath, "application/json");
  // Parse json
  return JSON.parse(json);
}   

// Load text with Ajax synchronously: takes path to file and optional MIME type
function loadTextFileAjaxSync(filePath, mimeType)
{
  var xmlhttp=new XMLHttpRequest();
  xmlhttp.open("GET",filePath,false);
  if (mimeType != null) {
    if (xmlhttp.overrideMimeType) {
      xmlhttp.overrideMimeType(mimeType);
    }
  }
  xmlhttp.send();
  if (xmlhttp.status==200 && xmlhttp.readyState == 4 )
  {
    return xmlhttp.responseText;
  }
  else {
    // TODO Throw exception
    return null;
  }
}

注意:此代码仅适用于现代浏览器 - IE8、FF、Chrome、Opera、Safari。对于过时的 IE 版本,您必须使用 ActiveX,如果需要,请告诉我,我会告诉您如何使用;)

于 2010-11-07T10:17:13.497 回答
4

如果您使用某种服务器脚本,您可以将数据打印到页面上的脚本标签:

<script type="text/javascript">
var settings = <?php echo $json; ?>;
</script>

这将允许您同步使用数据,而不是尝试异步使用 AJAX。

否则,您必须等待 AJAX 回调,然后才能继续您正在做的任何事情。

于 2010-11-07T08:35:22.283 回答
1

我只需要读取一个以 json 格式提供的小输入文件并提取少量数据。这在以下情况下工作得很好:

json 文件与脚本位于同一目录中,名为 data.json,它看起来像这样:

{"outlets":[
        {
            "name":"John Smith",
            "address":"some street, some town",
            "type":"restaurant"
        },
..etc...

像这样将数据读入js:

var data = <?php echo require_once('data.json'); ?>; 

像这样访问数据项:

for (var i in data.outlets) {    
var name = data.outlets[i].name;
... do some other stuff...
}
于 2013-02-20T15:44:24.453 回答
0

如果 RequireJS 是一个选项,您可以使用 requirejs 使其成为依赖项。我用它来模拟我的 Angular 应用程序中的数据。一些模拟数据在应用程序启动之前就已经存在,这一点很重要。

//Inside file my/shirt.js:
define({
    color: "black",
    size: "unisize"
});

只需将 json 数据包装在定义中并将其声明为依赖项即可。更多信息在这里:http ://requirejs.org/docs/api.html#defsimple

于 2013-09-02T21:05:43.453 回答
-2

由于潜在的性能问题,AFAIK jQuery 已弃用同步 XHR 请求。您可以尝试将您的应用程序代码包装在 XHR 响应处理程序中,如下所示:

$(document).ready(function() {
  $.get('/path/to/json/resource', function(response) {
    //'response' now contains your data
    //your app code goes here
    //...
  });
});
于 2015-11-25T21:30:10.277 回答
-3

没有 jQuery 的现代 HTML5 方式是:

   var url="https://api.myjson.com/bins/1hk8lu" || "my.json"
   var ok=await fetch(url)
   var json=await ok.json()
   alert(a.test)
于 2018-07-23T21:55:48.643 回答