2010-11-07 115 views
25


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

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

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

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

+1

取决于服务器。我在执行诸如var json = <%= jsonString%> – mplungjan 2010-11-07 08:34:18

+1

这样的事情时看不到问题为什么你想要一个同步请求? – Gumbo 2010-11-07 09:06:54

+1

我想我希望它是同步的,因为我想等待我的变量被初始化为json内容,然后在以下语句中使用它(没有json数据没有意义)。 – Paull 2010-11-07 16:22:33

回答

33

getJSON()只是ajax()函数与dataType:'json'集合的简写。 ajax()函数可以让你自定义很多请求。

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

仍然使用回调与async:false但它触发它执行从Ajax调用继续之前。

+2

我认为异步:false至少从jQuery v1.11开始已被弃用。以下是我在控制台中获得的消息: 主线程上的同步XMLHttpRequest已弃用,因为它对最终用户的体验有不利影响。如需更多帮助,请查看http://xhr.spec.whatwg.org/。 – 2015-09-28 15:42:54

+0

也许它已被弃用,那么替代方案是什么? – bgmCoder 2017-10-26 16:59:57

3

如果您正在使用某种形式的服务器脚本,你可以打印数据发送到网页上的脚本标签:

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

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

否则,您将不得不等待AJAX​​回调,然后继续进行任何操作。

+0

是的 - 就像那样。 – mplungjan 2010-11-07 08:45:09

+0

我正在编辑wordpress页面,更好地使用ajax我认为... – Paull 2010-11-07 16:45:14

+0

如果你正在同步进行,则不需要。 – VeXii 2013-07-06 22:00:41

12

在这里你去:

// 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,铬,歌剧,Safari浏览器。对于IE浏览器的版本,你必须使用ActiveX,如果你想要,我会告诉你如何;)

+0

对于同步请求,200状态从不起作用。总是会抛出异常。 – vsingh 2011-02-24 22:36:08

+0

这是不正确的,我使用这个代码,它总是工作正常。 – 2011-02-28 11:47:01

+0

同步阿贾克斯请求不会再工作 – 2018-03-08 03:55:57

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... 
} 
+1

这正是我所期待的。 所以没有办法可以将JSON作为页面资源(),然后从中读取? 我必须在包含的文件中做一个声明? 这感觉就像一个非常肮脏的方式来做到这一点 – 2bigpigs 2014-03-01 08:33:48

0

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

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

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

0

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

$(document).ready(function() { 
    $.get('/path/to/json/resource', function(response) { 
    //'response' now contains your data 
    //your app code goes here 
    //... 
    }); 
});