Я пытаюсь загрузить локальный файл JSON двумя способами.
Это мой файл json:
{
"imgsesion": "fa_closesesion.png",
"texthome": "volver a la home",
"logo": "fa_logo.png",
"menu": {
"background": "orange",
"link1": "ESCRITOR",
"link2": "MÚSICO",
"link3": "AYUDA ADMIN",
"submenu": {
"link1": {
"text1": "novelas",
"text2": "obras de teatro"
},
"link2": {
"text1": "compositor",
"text2": "intérprete"
}
}
}
}
Это мой служебный файл (general.service.ts)
getContentJSON() {
return this.http.get('assets/json/general.json')
.map(response => response.json());
}
Этот способ работает нормально, но в консоли веб-браузера отображается следующая ошибка:
ERROR TypeError: Cannot read property 'menu' of undefined
Это мой служебный файл (general.service.ts)
getContentJSON() {
return this.httpClient.get("assets/json/general.json");
}
Это не работает, потому что я не могу найти файл general.json, он проходит контроль ошибки и выдает ошибку 404
Это файл компонента (app.component.ts)
export class AppComponent implements OnInit {
contentGeneral: any;
ngOnInit() {
this.getContentJSON();
}
getContentJSON() {
this.generalService.getContentJSON().subscribe(data => {
this.contentGeneral = data;
}, // Bind to view
err => {
// Log errors if any
console.info('error: ', err);
});
}
}
Это файл шаблона (app.component.html):
<a href = "#" routerLink = "/home" class = "linkHome">{{contentGeneral.texthome}}</a>
<div class = "submenu" *ngIf = "linkWrite.isActive || isSubMenuWriter">
<span class = "d-block text-right small">{{contentGeneral.menu.submenu.link1.text1}}</span>
<span class = "d-block text-right small">{{contentGeneral.menu.submenu.link1.text2}}</span>
</div>
Это моя настоящая ошибка:
В app.component.ts добавляю импорт:
import * as data_json from './assets/json/general.json';
Но когда я запускаю ng serve, появляется следующая ошибка:
Как я мог это решить?

Самое простое решение:
import "myJSON" from "./myJson"
Важное обновление!
Я обнаружил, что этот метод перестает работать в новейших версиях Angular из-за этой ошибки:
ERROR in src/app/app.weather.service.ts(2,25): error TS2732: Cannot find module './data.json'. Consider using '--resolveJsonModule' to import module with '.json' extension
Чтобы он работал, перейдите в tsconfig.json и добавьте эти два внутри
compilerOptions (tsconfig.json):
"resolveJsonModule": true,
"esModuleInterop": true,
После изменения перезапустите ng serve.
Если вы используете только первый вариант, вы можете получить такую ошибку:
ERROR in src/app/app.weather.service.ts(2,8): error TS1192: Module '"....app/data/data.json"' has no default export.
(Я нашел здесь очень хороший ответ (https://www.angularjswiki.com/angular/how-to-read-local-json-files-in-angular/))
./src/app/app.component.ts Модуль не найден: ошибка: не удается разрешить './assets/json/general.json'
Это новый импорт: import * as json из './assets/json/general.json';
Я видел, что мне нужно добавить код объявления в файл typings.d.ts, но этот файл в Angular 6, я думаю, больше не существует
Также я протестировал импорт {data_json} из './assets/json/general.json'; и я получаю ту же ошибку
import * как данные из "./products.json"; console.info (data.property)
Когда я добавляю импорт в app.component.ts, это происходит, как показано на только что добавленном изображении.
Собственно проблема в пути и я думаю правила файла tsint.json, спасибо
Важный момент о добавлении typings.d.ts в Angular 6 stackoverflow.com/a/51040468/1845580 Вы должны создать файл, а затем добавить файл пользовательской типизации в typeRoots в tsconfig.json "typeRoots": ["node_modules / @ types", "src / typings. d.ts "],
esModuleInterop больше не требуется github.com/Microsoft/TypeScript/issues/25400
В моем ограниченном тестировании такой способ не позволяет взаимозаменяемому файлу json?
Это происходит потому, что вы запрашиваете файл JSON асинхронно, вы можете обрабатывать его с помощью оператора безопасной навигации или с помощью ngIf,
<div class = "submenu" *ngIf = "linkWrite.isActive || isSubMenuWriter">
<span class = "d-block text-right small">{{contentGeneral?.menu?.submenu?.link1?.text1}}</span>
<span class = "d-block text-right small">{{contentGeneral?.menu?.submenu?.link1?.text2}}</span>
</div>
или просто импортируйте файл JSON в свой компонент и назначьте sampleJSON.
import "sampleJSON" from "./sampleJSON"
Этим образом...
import "file" from "./file.json"
Я получил красную линию и получил ошибку, как будто модуль не найден angular.
После некоторого RND я получил другой способ, который работает для меня. Надеюсь, это может кому-то помочь.
var data = require('src/file.json');
console.info("Json data : ", JSON.stringify(data));
Думаю, это должен быть JSON.stringify(data).
Opps это опечатка. @UlianaPavelko
Спасибо. Этот метод у меня сработал. Я получил «Машинопись: оператор require не является частью оператора импорта» и решил его, изменив решение на import data = require('your_file.json').
использование "require" в angular требует следующих соображений - stackoverflow.com/questions/43104114/…
вы можете использовать следующий фрагмент кода:
declare const require;
const locale = localStorage.getItem('locale');
require(`./file.${locale}.json`)
import data from './data.json';
export class AppComponent {
json:any = data;
}
Обновленный ответ - Сервис Angular 5 для чтения локального файла .json
В tsconfig.json
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
Для Угловой 2, Угловой 4 и Угловой 5 вы можете использовать следующий метод для загрузки ваших локальных файлов .json в компонент.
const data = require('../../data.json');
export class AppComponent {
json:any = data;
}
Чтобы использовать require в вашем компоненте, вам необходимо установить @types/node, запустив
npm install @types/node --save-dev
Сделайте следующее изменение конфигурации в разделе tsconfig.app.json> compilerOptions
"compilerOptions": {
"types": ["node"],
...
},
После Угловой 6 вы можете использовать прямой импорт из файловой системы следующим образом.
import data from '../../data.json';
export class AppComponent {
json:any = data;
}
Сделайте следующее изменение конфигурации в разделе tsconfig.app.json> compilerOptions
"compilerOptions": {
...
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
...
},
Шаг 1: Откройте tsconfig.json и добавьте следующие строки в compilerOptions:
"resolveJsonModule": true,
"esModuleInterop": true
Шаг 2: импортирует json, используя следующий код:
import homeData from './data.json';
Примечание: Этот код протестирован с Angular 9
Создайте файл .ts, затем скопируйте туда содержимое вашего файла json и добавьте
export const <objectName> =
что-то вроде этого
export const faceProfilesSample =
[
{
"id": 1,
"depth": 0,
"burden": null
},
{
"id": 1,
"depth": 1.97,
"burden": 8.58
},
то вы можете получить к нему доступ, используя objectName с оператором импорта, подобным этому
import { faceProfilesSample } from "@app/model/face-profiles-sample";
Никаких изменений tsconfig.json не требуется
Есть другой способ сделать это. Вы можете создать экспортированный файл json внутри файла .ts и импортировать его в свой компонент. Затем вы можете получить доступ к thet json в своем компоненте