Подтвердить что ты не робот

Загрузить json из файла в объект

Борьба с загрузкой json из файла (myData.json) по URL-адресу в объект, чтобы я мог получить доступ к значениям свойств.

- Данные загружаются немедленно, мне это очень нужно в приложении.

- Я собираюсь получить доступ к данным во всем приложении, а не только как часть одной функции, которая происходит сразу после загрузки данных.

- Я гарантировал, что данные в моем файле правильно отформатированы json.

Следуя примеру API jquery, я не могу сделать что-то простое, например:

оповещения (jqxhr.myProperty);

и получить значение? На каком шаге я здесь отсутствую? Я пробовал использовать eval и различные вещи, например

var myObj = JSON.parse(jqxhr);

безрезультатно.

Пожалуйста, спасибо.

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

// perform other work here ...

// Set another completion function for the request above
jqxhr.complete(function(){ alert("second complete"); });
4b9b3361

Ответ 1

Я думаю, что вы делаете это слишком сложно:)

 var JSON;

 $.getJSON('example.json', function(response){
       JSON = response;
       alert(JSON.property);
 })
 //feel free to use chained handlers, or even make custom events out of them!
 .success(function() { alert("second success"); })
 .error(function() { alert("error"); })
 .complete(function() { alert("complete"); });

функция getJSON автоматически преобразует ваш ответ в правильный объект JSON. Не нужно разбираться.

Вы упомянули, что используете эти данные повсюду, поэтому вам придется ждать завершения вызова ajax до того, как данные будут доступны. Это означает, что вы завершаете все ваше приложение в обратном вызове getJSON. Или используя настраиваемое событие, чтобы определить так:

 var JSON;

 $(window).on('JSONready', function(){
       alert(JSON.property);
 });

 $.getJSON('example.json', function(response){
       JSON = response;
       $(window).trigger('JSONready');
 });

 $('#elem').on('click', function(){
       //event likely to take place after ajax call has transpired
       //it would still be better to assign this listener in a callback, 
       //but you can get away with not doing it, if you put in a catch
       if(JSON){
           alert(JSON.property);
       }          
 });

ИЗМЕНИТЬ

После быстрой отладки в реальном времени реальной причиной недоступности данных было следующее: javascript, который использует JSON, был расположен в файле, включая документ страницы NORTH встроенного javascript, выполняющего вызов. В результате JSON не была глобальной переменной, и область действия не позволяла ее использовать. Если вам действительно нужна переменная, которая будет глобальной, поэтому ее можно использовать с встроенным JS, а также с любыми включенными js файлами, вы можете сделать это следующим образом:

  (function(){
      var limitedScopeVariable = 25;
      window.globalScopeVariable = 30;
  })();

  $(function(){
       alert(globalScopeVariable); //works!
       alert(limitedScopeVariable); //fails!
  });

РЕДАКТИРОВАТЬ 2

Как и в jQuery 3.0, функции обратного вызова отличаются: jqXHR.success(), jqXHR.error() и jqXHR.complete() методы обратного вызова удаляются с jQuery 3.0. Вы можете использовать jqXHR.done(), jqXHR.fail(), и jqXHR.always() вместо

из комментариев @mario-lurig

Ответ 2

данные json передаются функции обратного вызова $.getJSON. Таким образом, это сработает:

var jqxhr;

$.getJSON("example.json", function(data) {
  jqxhr = data;
});

// alert(jqxhr.property);
// caution: this won't work immediately on load, since the ajax call runs asynchronously and hasn't finished at that time

// it should be available at a later time, like a click event
$('a#something').click(function(){
     if(jqxhr){
          alert(jqxhr.property);
     }else{
          alert('getJSON not yet complete or failed');
     }
});

Ответ 3

Я думаю, что это будет то, что вы ищете, вы пытаетесь получить доступ к данным, полученным с вашего вызова, а не к самому объекту вызывающего. В вашем примере jqxhr - это объект, который обрабатывает вызов JSON, а не данные. Таким образом,

$.getJSON("example.json", function(data) {
  yourDATA = data;
})

//Use your data here
alert(yourDATA.aProperty);

Самый первый пример на этой странице аналогичен тому, что я объяснил.