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.