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

Pau*_*ull 29 javascript parsing json synchronous getjson


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

我设法使用jQuery.getJSON,但这是asynch ajax,它似乎有点矫枉过正.

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

在此先感谢任何帮助,希望它是有道理的,因为我是一个JavaScript新手.保罗

Ale*_*yne 35

getJSON()只是简单ajax()dataType:'json'设置功能的简写.该ajax()功能可让您自定义很多有关请求的内容.

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

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

  • 我认为async:false至少是因为jquery v1.11而被弃用.这是我在控制台中收到的消息:主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用.如需更多帮助,请访问http://xhr.spec.whatwg.org/. (3认同)

Bor*_*nov 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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


zzz*_*Bov 5

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

<script type="text/javascript">
var settings = <?php echo $json; ?>;
</script>
Run Code Online (Sandbox Code Playgroud)

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

否则,您必须等待 AJAX 回调才能继续您正在执行的操作。