Angular 6 - загрузить JSON из локального

Я пытаюсь загрузить локальный файл 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"
      }
    }
  }
}
  • Способ 1: Использование HTTP

Это мой служебный файл (general.service.ts)

  getContentJSON() {
    return this.http.get('assets/json/general.json')
    .map(response => response.json());
  }

Этот способ работает нормально, но в консоли веб-браузера отображается следующая ошибка:

ERROR TypeError: Cannot read property 'menu' of undefined
  • Способ 2: Использование HttpClient

Это мой служебный файл (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, появляется следующая ошибка:

Angular 6 - загрузить JSON из локального

Как я мог это решить?

Есть другой способ сделать это. Вы можете создать экспортированный файл json внутри файла .ts и импортировать его в свой компонент. Затем вы можете получить доступ к thet json в своем компоненте

Sh. Pavel 19.06.2018 11:30
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
15
1
69 833
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Самое простое решение:

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'

Eladerezador 19.06.2018 12:08

Это новый импорт: import * as json из './assets/json/general.json';

Eladerezador 19.06.2018 12:09

Я видел, что мне нужно добавить код объявления в файл typings.d.ts, но этот файл в Angular 6, я думаю, больше не существует

Eladerezador 19.06.2018 12:14

Также я протестировал импорт {data_json} из './assets/json/general.json'; и я получаю ту же ошибку

Eladerezador 19.06.2018 12:19

import * как данные из "./products.json"; console.info (data.property)

Kamil Naja 19.06.2018 12:23

Когда я добавляю импорт в app.component.ts, это происходит, как показано на только что добавленном изображении.

Eladerezador 19.06.2018 13:42

Собственно проблема в пути и я думаю правила файла tsint.json, спасибо

Eladerezador 20.06.2018 11:31

Важный момент о добавлении typings.d.ts в Angular 6 stackoverflow.com/a/51040468/1845580 Вы должны создать файл, а затем добавить файл пользовательской типизации в typeRoots в tsconfig.json "typeRoots": ["node_modules / @ types", "src / typings. d.ts "],

Japo Domingo 18.10.2018 23:58

esModuleInterop больше не требуется github.com/Microsoft/TypeScript/issues/25400

Pieter De Bie 19.02.2019 11:07

В моем ограниченном тестировании такой способ не позволяет взаимозаменяемому файлу json?

Kody 12.08.2019 17:50

Это происходит потому, что вы запрашиваете файл 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).

Uliana Pavelko 12.02.2019 13:38

Opps это опечатка. @UlianaPavelko

Sachin Shah 12.02.2019 13:50

Спасибо. Этот метод у меня сработал. Я получил «Машинопись: оператор require не является частью оператора импорта» и решил его, изменив решение на import data = require('your_file.json').

Devin 22.04.2019 17:52

использование "require" в angular требует следующих соображений - stackoverflow.com/questions/43104114/…

Mauricio Gracia Gutierrez 18.10.2019 15:11

вы можете использовать следующий фрагмент кода:

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 не требуется

Другие вопросы по теме