Próbuję załadować plik .json do zmiennej w javascript, ale nie mogę go uruchomić. To prawdopodobnie tylko drobny błąd, ale nie mogę go znaleźć.
Wszystko działa dobrze, gdy używam takich danych statycznych:
var json = {
id: "whatever",
name: "start",
children: [{
"id": "0.9685",
"name": " contents:queue"
}, {
"id": "0.79281",
"name": " contents:mqq_error"
}
}]
}
Umieściłem wszystko, co znajduje się {}
w content.json
pliku, i próbowałem załadować to do lokalnej zmiennej JavaScript, jak wyjaśniono tutaj: załaduj json do zmiennej .
var json = (function() {
var json = null;
$.ajax({
'async': false,
'global': false,
'url': "/content.json",
'dataType': "json",
'success': function(data) {
json = data;
}
});
return json;
})();
Uruchomiłem go z debugerem Chrome i zawsze mówi mi, że wartość zmiennej json
to null
. Plikcontent.json
rezyduje plik w tym samym katalogu co plik .js że nazywa go.
Co mnie ominęło?
javascript
jquery
json
PogoMips
źródło
źródło
/content.json
oznacza, że plik znajduje się na poziomie głównym aplikacji internetowej. Zmień nacontent.json
(bez ukośnika), aby wskazać ten sam katalog, w którym znajduje się plik skryptu. Tylko w przypadku, gdy plik skryptu znajduje się w katalogu głównym, zadziała.Odpowiedzi:
Jeśli wkleiłeś obiekt
content.json
bezpośrednio do , jest to nieprawidłowy JSON. Klucze i wartości JSON muszą być umieszczone w podwójnych cudzysłowach ("
nie'
), chyba że wartość jest liczbowa, logicznanull
lub złożona (tablica lub obiekt). JSON nie może zawierać funkcji aniundefined
wartości. Poniżej znajduje się Twój obiekt w prawidłowym formacie JSON.Miałeś też dodatkowy
}
.źródło
Moje rozwiązanie, jak odpowiedział tutaj jest do wykorzystania:
Plik jest ładowany tylko raz, kolejne żądania wykorzystują pamięć podręczną.
edytuj Aby uniknąć buforowania, oto funkcja pomocnicza z tego posta podana w komentarzach za pomocą
fs
modułu:źródło
W przypadku ES6 / ES2015 możesz importować bezpośrednio, jak:
Jeśli używasz Typescript, możesz zadeklarować moduł json taki jak:
Od wersji 2.9 i wersji Typescript można dodawać --olveJsonModule compilerOptions w
tsconfig.json
źródło
Uncaught SyntaxError: Unexpected token *
data
jest to moduł, aledata.default
jest to obiektSyntaxError: Unexpected token *
import * as data from './example.json'
powodu błędu typu MIME.import * as data from './example.json';
todata
jest tylko modułem, aledata.default
jest obiektem. Ale gdy używamimport data from './example.json';
następniedata
jest przedmiotem, który jest bardziej applicapableIstnieją dwa możliwe problemy:
AJAX jest asynchroniczny, więc
json
będzie niezdefiniowany po powrocie z funkcji zewnętrznej. Po załadowaniu pliku zostanie ustawiona funkcja wywołania zwrotnegojson
jakąś wartość, ale w tym czasie nikogo to już nie obchodzi.Widzę, że próbowałeś to naprawić
'async': false
. Aby sprawdzić, czy to działa, dodaj tę linię do kodu i sprawdź konsolę przeglądarki:Ścieżka może być zła. Użyj tej samej ścieżki, której użyłeś do załadowania skryptu w dokumencie HTML. Więc jeśli twój skrypt to
js/script.js
, użyjjs/content.json
Niektóre przeglądarki mogą pokazać, do których adresów URL próbowały uzyskać dostęp i jak poszło (kody powodzenia / błędu, nagłówki HTML itp.). Sprawdź narzędzia programistyczne przeglądarki, aby zobaczyć, co się dzieje.
źródło
Wbudowany moduł node.js fs zrobi to asynchronicznie lub synchronicznie, w zależności od Twoich potrzeb.
Możesz go załadować za pomocą
var fs = require('fs');
Asynchroniczny
Synchroniczny
źródło
Dla podanego formatu json, jak w pliku ~ / my-app / src / db / abc.json:
w celu zaimportowania do pliku .js, takiego jak ~ / my-app / src / app.js:
Wynik:
źródło