Как включить данные JSON в javascript синхронно без разбора?
Я хочу загрузить JSON файл с моего собственного сервера, содержащего массив, в переменную Object javascript.
Я хотел бы сделать это в начале загрузки страницы синхронно, потому что необходимы данные во время загрузки страницы.
Мне удалось использовать jQuery.getJSON, но это асинхронный ajax и кажется немного переборщиком.
Есть ли способ загрузить JSON синхронно, не делая свой собственный синтаксический анализ? (более или менее как с помощью <script language="JavaScript" src="MyArray.json"></script>
)
Заранее благодарим за любую помощь, надеюсь, что это имеет смысл, так как я новичок в javascript.
Paolo
Ответы
Ответ 1
getJSON()
является просто сокращением для функции ajax()
с набором dataType:'json'
. Функция ajax()
позволит вам настроить многое о запросе.
$.ajax({
url: 'MyArray.json',
async: false,
dataType: 'json',
success: function (response) {
// do stuff with response.
}
});
Вы по-прежнему используете обратный вызов с async:false
, но он запускается до того, как выполнение продолжается от вызова ajax.
Ответ 2
Здесь вы идете:
// 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, сообщите мне, если хотите, я расскажу вам, как;)
Ответ 3
если вы используете какой-либо сервер script, вы можете распечатать данные на теге script на странице:
<script type="text/javascript">
var settings = <?php echo $json; ?>;
</script>
Это позволит вам использовать ваши данные синхронно, а не пытаться использовать AJAX асинхронно.
В противном случае вам придется дождаться обратного вызова AJAX, прежде чем продолжить то, что вы делаете.
Ответ 4
Мне нужно было только прочитать небольшой входной файл, предоставленный в формате json, и извлечь небольшой объем данных. Это обстоятельство прекрасно срабатывало при следующих обстоятельствах:
Файл json находится в том же каталоге, что и script и называется 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...
}
Ответ 5
Я нашел это краткое руководство понятным: Синхронизация загрузки JSON в jQuery
Ответ 6
Если RequireJS является опцией, вы можете сделать его зависимым, используя requirejs. Я использую его для издевательства данных в моем приложении Angular. Очень важно, чтобы некоторые из насмешливых данных находились перед загрузкой приложения.
//Inside file my/shirt.js:
define({
color: "black",
size: "unisize"
});
Просто оберните данные json в определение и объявите его как зависимость. Подробнее здесь: http://requirejs.org/docs/api.html#defsimple
Ответ 7
AFAIK jQuery отказался от синхронных запросов XHR из-за потенциальных проблем с производительностью. Вы можете попробовать обернуть свой код приложения в обработчике XHR-ответа, как показано ниже:
$(document).ready(function() {
$.get('/path/to/json/resource', function(response) {
//'response' now contains your data
//your app code goes here
//...
});
});