如何在没有解析的情况下同步包含JSON数据?

时间:2010-11-07 08:29:00

标签: javascript json parsing getjson synchronous


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

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

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

提前感谢您的帮助,希望它是有道理的,因为我是一个javascript新手。 保罗

7 个答案:

答案 0 :(得分:35)

getJSON()只是设置ajax()的{​​{1}}函数的简写。 dataType:'json'功能可让您自定义很多有关请求的内容。

ajax()

你仍然使用$.ajax({ url: 'MyArray.json', async: false, dataType: 'json', success: function (response) { // do stuff with response. } }); 的回调,但它在从ajax调用继续执行之前触发。

答案 1 :(得分:14)

你走了:

// 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)
  {
    return xmlhttp.responseText;
  }
  else {
    // TODO Throw exception
    return null;
  }
}

注意:此代码仅适用于现代浏览器 - IE8,FF,Chrome,Opera,Safari。对于obosolete IE版本,你必须使用ActiveX,如果你想要我会告诉你如何让我知道;)

答案 2 :(得分:3)

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

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

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

否则你将不得不等待AJAX​​回调,然后再继续你正在做的事情。

答案 3 :(得分: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...
}

答案 4 :(得分:0)

如果RequireJS是一个选项,您可以使用requirejs使其成为依赖项。我用它来模拟我的Angular应用程序中的数据。在应用程序的引导程序之前,一些模拟数据是必不可少的。

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

将json数据包装在一个define中,并将其声明为依赖项。更多信息:http://requirejs.org/docs/api.html#defsimple

答案 5 :(得分:-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
    //...
  });
});

答案 6 :(得分:-2)

没有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)