Charger json du fichier dans l'objet

S'efforcer de charger json du fichier (myData.json) sur l'URL dans un objet afin d'accéder aux valeurs de la propriété.

– Les données sont chargées immédiatement, j'ai beaucoup besoin de ça dans l'application.

– Je vais accéder aux données dans l'application, pas seulement dans le cadre d'une fonction qui se produit immédiatement après la charge des données.

– J'ai assuré que les données dans mon fichier sont correctement formatées json.

En suivant l'exemple de l'API jquery, ne devrais-je pas pouvoir faire quelque chose de simple comme:

Alerte (jqxhr.myProperty);

Et obtenir la valeur? Quelle étape me manque-t-il ici? J'ai essayé d'exécuter eval et une variété de choses comme

Var myObj = JSON.parse (jqxhr);

En vain.

S'il vous plait merci.

// 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"); }); 

Je pense que vous le rendez trop compliqué 🙂

  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"); }); 

La fonction getJSON convertit automatiquement votre réponse en un objet JSON approprié. Pas besoin d'analyser.

Vous avez mentionné que vous utilisez ces données partout, de sorte que vous devrez attendre que l'appel ajax soit terminé avant que les données ne soient disponibles. Cela implique soit l'emballage de votre application entière dans le rappel de getJSON . Ou en utilisant un événement personnalisé pour déterminer comme suit:

  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); } }); 

MODIFIER

Après un débogage rapide en direct, la raison vraie pour laquelle les données n'étaient pas disponibles était la suivante: javascript qui consomme JSON était situé dans un fichier incluant le document de page NORTH de javascript en ligne exécutant l'appel. Par conséquent, JSON n'était pas une variable globale, et la portée empêchait son utilisation. Si vous avez vraiment besoin d'une variable pour être globale afin qu'elle puisse être utilisée avec JS en ligne ainsi que tous les fichiers js inclus, vous pouvez le faire comme ceci:

  (function(){ var limitedScopeVariable = 25; window.globalScopeVariable = 30; })(); $(function(){ alert(globalScopeVariable); //works! alert(limitedScopeVariable); //fails! }); 

EDIT 2

À partir de jQuery 3.0, les fonctions de rappel sont différentes: les méthodes de rappel jqXHR.success (), jqXHR.error () et jqXHR.complete () sont supprimées à partir de jQuery 3.0. Vous pouvez utiliser jqXHR.done (), jqXHR.fail () et jqXHR.always () à la place

Des commentaires @ mario-lurig

Les données de json sont passées à la fonction de rappel de $ .getJSON. Donc cela fonctionnerait:

 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'); } }); 

Je pense que ce serait ce que vous recherchez, vous essayez d'accéder aux données retournées par votre appel et non à l'objet appelant lui-même. Dans votre exemple, jqxhr est l'objet qui gère l'appel JSON et non les données. Alors,

 $.getJSON("example.json", function(data) { yourDATA = data; }) //Use your data here alert(yourDATA.aProperty); 

Le premier exemple de cette page est similaire à ce que j'ai expliqué.