Buduję aplikację mapową za pomocą Angular Maps i chcę zaimportować plik JSON jako listę markerów definiujących lokalizacje. Mam nadzieję, że użyję tego pliku JSON jako tablicy znaczników [] wewnątrz pliku app.component.ts. Zamiast definiować zakodowaną na stałe tablicę znaczników w pliku TypeScript.
Jaki jest najlepszy proces importowania tego pliku JSON do wykorzystania w moim projekcie? Doceniany każdy kierunek!
json
angular
google-maps
typescript
maps
aonepathan
źródło
źródło
Odpowiedzi:
Jedna linijka Aonepathana działała dla mnie aż do ostatniej aktualizacji maszynopisu.
Znalazłem Jecelyn Yeen za wpis , który sugeruje komentarz ten fragment do pliku definicji TS
dodaj plik
typings.d.ts
do folderu głównego projektu z poniższą zawartościądeclare module "*.json" { const value: any; export default value; }
a następnie zaimportuj swoje dane w ten sposób:
import * as data from './example.json';
aktualizacja lipiec 2019:
Typescript 2.9 ( docs ) wprowadził lepsze, inteligentniejsze rozwiązanie. Kroki:
resolveJsonModule
wsparcie z tym wierszem w swoimtsconfig.json
pliku:"compilerOptions": { ... "resolveJsonModule": true }
instrukcja import może teraz zakładać domyślny eksport:
import data from './example.json';
a intellisense sprawdzi teraz plik json, aby zobaczyć, czy możesz użyć metod Array itp. całkiem fajne.
źródło
Cannot find module '*.json'. Consider using '--resolveJsonModule' to import module with '.json' extensionts(2732)
"esModuleInterop": true,
jak określono w dokumentach maszynopisu, jednak mówią również, że należy używaćcommonjs
jakomodule
zamiastesnext
. Wydaje się, że to działa w przypadku obu. Czy jest jakiś powód, aby przejść na commonjs (jak wspomniano w dokumentacji), zamiast trzymać się domyślnego esnext?"esModuleInterop":true
. Również kod VS nadal pokazuje mi błąd ... ale wszystko działa dobrze"allowSyntheticDefaultImports": true
wcompilerOptions
jak również ze świeżym Kątowymi 9.1.11 projektu.Jak wspomniano w tym poście reddit , po Angular 7 możesz uprościć rzeczy do tych 2 kroków:
compilerOptions
w swoimtsconfig.json
pliku:"resolveJsonModule": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true
import myData from '../assets/data/my-data.json';
I to wszystko. Możesz teraz używać
myData
w swoich komponentach / usługach.źródło
esModuleInterop
?Oto pełna odpowiedź dla Angular 6+ oparta na odpowiedzi @ryanrain:
Z angular-cli doc , json można traktować jako zasoby i uzyskiwać do niego dostęp ze standardowego importu bez użycia żądania Ajax.
Załóżmy, że dodajesz swoje pliki json do katalogu „your-json-dir”:
dodaj „your-json-dir” do pliku angular.json (:
"assets": [ "src/assets", "src/your-json-dir" ]
utwórz lub edytuj plik typings.d.ts (w katalogu głównym projektu) i dodaj następującą zawartość:
declare module "*.json" { const value: any; export default value; }
Umożliwi to import modułów „.json” bez błędu maszynopisu.
w pliku kontrolera / usługi / czegokolwiek innego, po prostu zaimportuj plik, używając tej ścieżki względnej:
import * as myJson from 'your-json-dir/your-json-file.json';
źródło
Dzięki za wkład, udało mi się znaleźć poprawkę, dodałem i zdefiniowałem json w górnej części pliku app.component.ts:
var json = require('./[yourFileNameHere].json');
To ostatecznie stworzyło markery i jest prostą linią kodu.
źródło
error TS2304: Cannot find name 'require'.
rozwiązany przez dodaniedeclare var require: any;
, jak wyjaśniono w komentarzach zaakceptowanej odpowiedzi na pytanie stackoverflow.com/questions/43104114/… ."compilerOptions": { ... "types": ["node"] },
tutaj jest powiązana odpowiedź dla tych, którzy jej potrzebują: stackoverflow.com/a/35961176/1754995var json = require('./[yourFileNameHere]');
bez rozszerzenia. W czasie kompilacji mam błąd:Module not found: Error: Can't resolve [yourFileNameHere] in [file name]
czy masz pomysł na obejście tego problemu?Pierwsze rozwiązanie - po prostu zmień rozszerzenie swojego pliku .json na .ts i dodaj
export default
na początku pliku, na przykład:export default { property: value; }
Następnie możesz po prostu zaimportować plik bez potrzeby dodawania tekstów, na przykład:
import data from 'data';
Drugie rozwiązanie pobierz plik json za pośrednictwem HttpClient.
Wstrzyknij HttpClient do swojego komponentu, na przykład:
export class AppComponent { constructor(public http: HttpClient) {} }
a następnie użyj tego kodu:
this.http.get('/your.json').subscribe(data => { this.results = data; });
https://angular.io/guide/http
To rozwiązanie ma jedną wyraźną przewagę nad innymi rozwiązaniami przedstawionymi tutaj - nie wymaga przebudowy całej aplikacji, jeśli Twój json się zmieni (jest ładowany dynamicznie z oddzielnego pliku, więc możesz modyfikować tylko ten plik).
źródło
Przeczytałem niektóre odpowiedzi i wydawały się nie działać dla mnie. Używam Typescript 2.9.2, Angular 6 i próbuję zaimportować JSON w Jasmine Unit Test. Oto, co mi się udało.
Dodaj:
"resolveJsonModule": true,
Do
tsconfig.json
Importuj jak:
import * as nameOfJson from 'path/to/file.json';
Przestań
ng test
, zacznij od nowa.Źródła: https://blogs.msdn.microsoft.com/typescript/2018/05/31/announcing-typescript-2-9/#json-imports
źródło
Dla Angular 7+,
1) dodaj plik „typings.d.ts” do folderu głównego projektu (np. Src / typings.d.ts):
declare module "*.json" { const value: any; export default value; }
2) importuj i uzyskuj dostęp do danych JSON:
import * as data from 'path/to/jsonData/example.json'; ... export class ExampleComponent { constructor() { console.log(data.default); } }
lub:
import data from 'path/to/jsonData/example.json'; ... export class ExampleComponent { constructor() { console.log(data); } }
źródło
src/app/services/
folderze, a twój json jest wsrc/assets/data/
folderze, musisz to określić jak../../assets/data/your.json
W angular7 po prostu użyłem
let routesObject = require('./routes.json');
Mój plik route.json wygląda następująco
{ "routeEmployeeList": "employee-list", "routeEmployeeDetail": "employee/:id" }
Dostęp do elementów JSON uzyskujesz za pomocą
źródło
reuqire
błąd - po prostu dodajdeclare var require: any;
na górze komponent klasy.Od Typescript 2.9 można po prostu dodać:
"compilerOptions": { "resolveJsonModule": true }
do
tsconfig.json
. Odtąd łatwo jest używać pliku json ( i będzie też ładne wnioskowanie o typie w VSCode):data.json
:{ "cases": [ { "foo": "bar" } ] }
W pliku Typescript:
import { cases } from './data.json';
źródło
let fs = require('fs'); let markers; fs.readFile('./markers.json', handleJSONFile); var handleJSONFile = function (err, data) { if (err) { throw err; } markers= JSON.parse(data); }
źródło
Kątowy 10
Zamiast tego powinieneś teraz edytować plik
tsconfig.app.json
(zwróć uwagę na „aplikację” w nazwie).Tam znajdziesz
compilerOptions
i po prostu dodajresolveJsonModule: true
.Na przykład plik w zupełnie nowym projekcie powinien wyglądać tak:
/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "extends": "./tsconfig.base.json", "compilerOptions": { "outDir": "./out-tsc/app", "types": [], "resolveJsonModule": true }, "files": [ "src/main.ts", "src/polyfills.ts" ], "include": [ "src/**/*.d.ts" ] }
źródło