ECMAScript 6에서 JSON 파일을 가져 오는 방법은 무엇입니까?


162

Ecmascript 6에서 json 파일에 어떻게 액세스합니까? 다음은 작동하지 않습니다.

import config from '../config.json'

JavaScript 파일을 가져 오려고하면 제대로 작동합니다.


4
이것은 ES6과 관련이 없지만 사용중인 모듈 로더와 관련이 있습니다. 구문 자체는 괜찮습니다.
— Felix Kling

2
가장 깨끗한 방법은 사용 webpack하고 json-loader사용하는 것입니다.
— suprita shankar

11
ES6는 다음 구문으로 JSON 가져 오기를 지원합니다. import * as data from './example.json';
— williamli

답변:


84

간단한 해결 방법 :

config.js

export default
{
  // my json here...
}

그때...

import config from '../config.js'

기존 .json 파일을 가져올 수는 없지만 작업을 수행합니다.


170
이것은 실제로 질문에 대답하지 않습니다. 예를 들어 package.json을 package.js로 간단히 변환 할 수는 없습니다. JS가 아닌 JSON을 실제로 가져오고 싶은 경우가 있습니다.
— curiousdannii

23
전혀 해결책이 아니라 JSON과 동일한 구문을 갖는 자바 스크립트 객체를 내보내는 것입니다.
— Ma Jerez

이슈 텍스트를 업데이트했습니다. 추가 의미 론적 논쟁을 피하려고 노력하십시오.
— 길버트

"postbuild": "node myscript.js"replace-in-file을 사용하여 나를 위해 package.json 파일에 단계를 추가했습니다 . myscript.js ­ const replace = require('replace-in-file'); const options = { files: '_demo/typedocs/navexReact.td.js', from: /{/, to: 'export default {', }; const convertJsonOutputToJsModule = async () => { try { const changes = await replace(options) console.log('Converted json to module in files:', changes.join(', ')); } catch (error) { console.error('Error occurred:', error); } } convertJsonOutputToJsModule()
— StJohn3D

1
"JS로 변환"은 JSON 파일을 가져 오는 방법에 대한 솔루션이 아닙니다. 더 이상 JSON 파일이 아닙니다. 이것은 JSON을 가져 오는 방법에 대한 Google 최고의 결과이며, 주요 대답은 JSON을 가져 오지 않는 것입니다.
— Jimbo Jonny

119

TypeScript 또는 Babel을 사용하면 코드에서 json 파일을 가져올 수 있습니다.

// Babel

import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'

참조 : https://hackernoon.com/import-json-into-typescript-8d465beded79


13
이것 (typescript json import)에 추가하기 만하면 tsconfig에 간단히 추가 할 수 있습니다 ... { "compilerOptions": { "resolveJsonModule": true}}
— Matt Coady

4
어떤 브라우저에서도이 기능을 지원합니까? 나는 현재 FF에서 이것을 시도하고 오류를 얻는다 Loading failed for the module with source "example.json"; Chrome에서 "모듈 스크립트를로드하지 못했습니다 : 서버가 자바 스크립트가 아닌 MIME 유형 인"application / json "으로 응답했습니다. HTML 사양에 따라 모듈 스크립트에 대해 엄격한 MIME 유형 검사가 시행됩니다."
— Coderer

@ Coderer 그것은 모든 브라우저에서 작동합니다. ES6 / ES2015 지원이 활성화되어 있습니까?
— williamli

2
"ES6에서"라고 말할 때 실제로는 "TS에서"를 의미합니다. 나는 당신이 방출 한 코드에 대해 이야기하고 있다고 생각 tsc했지만 실제로는 그렇지 않습니다. 브라우저에서 기본적으로 ES6 모듈을 실행하려고하는데 ( <script type="module">) 위의 오류는 해당 import라인을 직접 실행하면 발생하는 오류 입니다. 내가 틀렸다면 나를 정정하십시오. 실제로 ES6에서 JSON에서 가져올 수 있음을 의미했습니다.
— Coderer

3
"브라우저를 통해 브라우저를 변환 한 후"라고 말한 것은 아닙니다. 링크 한 첫 번째 기사는 TS가 import명령문을 노드로 변환하고 require()(시도하십시오!) 두 번째 링크는 JSON 가져 오기에 대해 아무 것도 말하지 않습니다. 문제는 여기에 파서 또는 모듈 시스템으로하지 않습니다, 그것은이다 로더 - 브라우저의 로더는 자바 스크립트 다른 아무것도 가져 오기가 해결되지 않습니다. 빌드 툴체인이 추상화하지 않더라도 항상 AJAX 호출 (fetch / XHR)을 사용하고 결과를 구문 분석해야합니다.
— Coderer

67

불행히도 ES6 / ES2015는 모듈 가져 오기 구문을 통한 JSON 로딩을 지원하지 않습니다. 그러나 ...

당신이 그것을 할 수있는 많은 방법이 있습니다. 필요에 따라 JavaScript로 파일을 읽는 방법을 살펴 window.FileReader보거나 (브라우저에서 실행중인 경우 옵션 일 수 있음) 다른 질문에 설명 된대로 다른 로더를 사용할 수 있습니다 (NodeJS를 사용한다고 가정).

IMO의 가장 간단한 방법은 JSON을 JS 객체로 ES6 모듈에 넣고 내보내는 것입니다. 그렇게하면 필요한 곳으로 가져올 수 있습니다.

당신이 JSON 파일의 가져 오기, 웹팩을 사용하는 경우 또한 가치가 주목 기본적으로 작동합니다 (이후 webpack >= v2.0.0).

import config from '../config.json';

5
문자열에 넣을 필요가 없습니다. 결국 JSSN이 아닌 JSON이라고합니다.
— 더 나은 올리버

4
또한 토라 자부로는 이전에 삭제 된 답변에서 설명했다 : ES6 "모듈 시스템"은 없다; 특정 로더에 의해 구현되는 API가 있습니다. 모든 로더는 JSON 파일 가져 오기 지원을 포함하여 원하는 모든 작업을 수행 할 수 있습니다. 예를 들어, 로더는 directory / index.js를 가져 오기위한 의미로 './directory에서 import foo를 지원하도록 선택할 수 있습니다.
— CodingIntrigue

5
실제로 ES6 / ES2015는 가져 오기 구문을 통해 JSON로드를 지원합니다. import * as data from './example.json';
— williamli 2016 년

웹팩에서 자동으로 수행한다는 사실을 알리는 +1 "test : /.js/"가 있으면 webpack은 json 파일을 JavaScript로 컴파일하려고 시도합니다. #불합격. 문제를 해결하려면 "test : /.js$/"로 변경하십시오.
— Rap

webpack은 nodejs를 기반으로합니까?
— Ayyash

20

babel + browserify를 사용하고 있으며 번역 네임 스페이스가있는 ./i18n/locale-en.json 디렉토리에 ngTranslate과 함께 사용되는 JSON 파일이 있습니다.

JSON 파일에서 아무것도 내보낼 필요없이 (btw는 불가능합니다)이 구문을 사용하여 내용을 기본적으로 가져올 수 있습니다.

import translationsJSON from './i18n/locale-en';

13

노드를 사용하는 경우 다음을 수행 할 수 있습니다.

const fs = require('fs');

const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time

또는

const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');

그밖에:

// config.js
{
// json object here
}

// script.js

import { config } from '../config.js';

또는

import * from '../config.json'

9

빌드 도구 및 JSON 파일 내의 데이터 구조에 따라을 가져와야 할 수도 있습니다 default.

import { default as config } from '../config.json';

예를 들어 사용 Next.js


타이프 라이터에 대한 추가 참고 보장하는 resolveJsonModule것입니다 true당신을 tsconfig.json.
— Pat Migliaccio

1
완벽하게 일했다! json을 가져 와서 변수에 저장할 때이 솔루션이 작동합니다.
— JP Bala Krishna

1

조금 늦었지만 package.json 버전을 기반으로 앱 버전을 보내는 것과 관련된 웹 응용 프로그램에 대한 분석을 제공하려고 시도하면서 동일한 문제가 발생했습니다.

구성은 다음과 같습니다. React + Redux, Webpack 3.5.6

json-loader는 Webpack 2 이상부터 많은 작업을 수행하지 않으므로 약간의 문제를 해결 한 후 제거했습니다.

실제로 나를 위해 일한 솔루션은 단순히 가져 오기를 사용하는 것입니다. 이것은 아마도 비동기 접근 방식에 적응하기 위해 일부 코드 변경을 시행 할 것이지만 특히 페치가 즉석에서 json 디코딩을 제공한다는 사실을 감안할 때 완벽하게 작동했습니다.

그래서 여기 있습니다 :

  fetch('../../package.json')
  .then(resp => resp.json())
  .then((packageJson) => {
    console.log(packageJson.version);
  });

여기서 특별히 package.json에 대해 이야기하고 있기 때문에 파일은 일반적으로 프로덕션 빌드 (또는 그 문제에 대한 개발자)에 번들로 제공되지 않으므로 CopyWebpackPlugin을 사용하여 액세스해야합니다. 가져 오기를 사용할 때.


캔트. 가져 오기가 로컬 파일을 지원하지 않습니다 ... polyfill 등을 사용 중일 수 있습니다.
— sapy

@sapy의 달 늦게 답장을하지만, 가져 오기 API는 대부분의 절대적 않는 상대 경로에서 서버의 호스트 이름뿐만 아니라로드를 지정하지 않고 경로에서 지원로드. 당신이 생각하고있는 것은 file:///URL에서 로드 하는 것입니다.
— Jamie Ridding

1

가져 오기가있는 브라우저에서 (기본적으로 모두)

현재 importJSON MIME 형식의 파일 은없고 JavaScript MIME 형식의 파일 만 있습니다. 향후 추가 될 기능 일 수 있습니다 ( 공식 토론 ).

fetch('./file.json')
  .then(response => response.json())
  .then(obj => console.log(obj))

Node.js v13.2 +에서 :

현재 --experimental-json-modules플래그 가 필요합니다 . 그렇지 않으면 기본적으로 지원되지 않습니다.

달리기

node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"

콘솔에 출력되는 obj 컨텐츠를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.