변수에 로컬 JSON 파일로드


113

.json 파일을 javascript의 변수에로드하려고하는데 작동하게 할 수 없습니다. 아마도 사소한 오류 일 수 있지만 찾을 수 없습니다.

다음과 같은 정적 데이터를 사용할 때 모든 것이 잘 작동합니다.

var json = {
  id: "whatever",
  name: "start",
  children: [{
      "id": "0.9685",
      "name": " contents:queue"
    }, {
      "id": "0.79281",
      "name": " contents:mqq_error"
    }
  }]
}

파일 {}에있는 모든 것을 content.json파일에 넣고 여기에 설명 된대로 로컬 JavaScript 변수에로드하려고했습니다. load json into variable .

var json = (function() {
  var json = null;
  $.ajax({
    'async': false,
    'global': false,
    'url': "/content.json",
    'dataType': "json",
    'success': function(data) {
      json = data;
    }
  });
  return json;
})();

Chrome 디버거로 실행했는데 항상 변수의 값 jsonnull. content.json를 호출의 .js 파일과 같은 디렉토리에 파일이 상주.

내가 놓친 게 무엇입니까?


1
파일 URL은 /content.json파일이 웹 앱의 루트 수준에 있음을 의미합니다. content.json(슬래시없이)로 변경 하여 스크립트 파일이있는 동일한 디렉토리를 가리 킵니다. 스크립트 파일이 루트 레벨 디렉토리에있는 경우에만 작동합니다.
Samich

파일은 WebContent \ jit \ content.json에 있습니다. 'url': "/WebContent/jit/content.json"을 시도했지만 여전히 변수는 null입니다
PogoMips 2013 년

답변:


38

개체를 content.json직접 붙여 넣은 경우 잘못된 JSON입니다. 값이 숫자, 부울 또는 복합 (배열 또는 객체) 이 아닌 경우 JSON 키 값은 큰 따옴표 ( "아님 ')로 묶어야합니다 null. JSON은 함수 나 undefined값을 포함 할 수 없습니다 . 아래는 유효한 JSON으로 개체입니다.

{
  "id": "whatever",
  "name": "start",
  "children": [
    {
      "id": "0.9685",
      "name": " contents:queue"
    },
    {
      "id": "0.79281",
      "name": " contents:mqq_error"
    }
  ]
}

당신은 또한 여분의 }.


1
나는 그것이 그것을 고쳤다는 것을 믿을 수 없습니다 .. 왜 큰 따옴표없이 .js 파일에 직접 삽입되지만 .json 파일에는 포함되지 않습니까? 말이 안
돼요

16
@ user1695165-json과 javascript 객체는 서로 다른 두 가지이며 똑같이 보입니다.
adeneo

2
@Kevin B "... 값이 숫자 [또는 부울]가 아닌 경우."
Jacob Beauchamp 2017 년

1
팁 : jsonlint.com 과 같은 json 유효성 검사기 를 사용하여 사용하기 전에 json 데이터를 확인할 수 있습니다.
마르코 Panichi

129

여기 에 대답 한 내 솔루션 은 다음을 사용하는 것입니다.

    var json = require('./data.json'); //with path

파일은 한 번만로드되며 추가 요청은 캐시를 사용합니다.

편집 캐싱을 피하기 위해 모듈을 사용하여 주석에 제공된 이 블로그 게시물 의 도우미 기능은 다음과fs 같습니다.

var readJson = (path, cb) => {
  fs.readFile(require.resolve(path), (err, data) => {
    if (err)
      cb(err)
    else
      cb(null, JSON.parse(data))
  })
}

48
이 솔루션에 RequireJS 라는 추가 라이브러리가 필요함을 지정하고 싶었 습니다 .
Luis Kabongo

4
캐싱을 피하는 방법?
nono

2
Guilherme Oenning에 따라 권장하지 않음은 goenning.net/2016/04/14/stop-reading-json-files-with-require
Sangimed

2
TLDR; 캐싱은 단위 테스트에서 그를 맞았으므로 캐싱을 피하기 위해 도우미 기능을 제공합니다 (@nono 핑).
Ehvince

@Ehvince Oh 나는 전체 기사를 읽지 않았기 때문에 그것을 알지 못했습니다. 감사를 :-)
Sangimed

50

ES6 / ES2015의 경우 다음 과 같이 직접 가져올 수 있습니다 .

// example.json
{
    "name": "testing"
}


// ES6/ES2015
// app.js
import * as data from './example.json';
const {name} = data;
console.log(name); // output 'testing'

Typescript를 사용하는 경우 다음과 같이 json 모듈을 선언 할 수 있습니다.

// tying.d.ts
declare module "*.json" {
    const value: any;
    export default value;
}

Typescript 2.9 이상부터 추가 할 수 있습니다 -resolveJsonModule compilerOptions intsconfig.json

{
  "compilerOptions": {
    "target": "es5",
     ...
    "resolveJsonModule": true,
     ...
  },
  ...
}

5
가져 오기가 Chrome v72에서 작동하지 않음-여전히Uncaught SyntaxError: Unexpected token *
1000Gbps

2
내가 이것을 사용하는 경우, 그것은 보인다 data모듈하지만 data.default객체입니다
더스틴 미첼

1
나는 이것을 콘솔에서 실행하려고했지만 성공하지 못했습니다. 이것은 babel-node 6.26.0을 사용하는 노드 v12.4.0에서는 작동하지 않습니다. 나는 항상 얻는다SyntaxError: Unexpected token *
mario199

2
ES6 / ES2015의 경우 직접 가져올 수 있습니다. import * as data from './example.json'MIME 유형 오류로 인해 콘솔 오류가 발생하는 것 같습니다 .
Fallenreaper 19

내가 사용하는 경우 import * as data from './example.json';다음 data단지 모듈이지만, data.default객체입니다. 그러나 때 내가 사용 import data from './example.json';한 다음 data더 applicapable 인 객체입니다
Nel 보낸

4

두 가지 가능한 문제가 있습니다.

  1. AJAX는 비동기식이므로 json외부 함수에서 돌아 오면 정의되지 않습니다. 파일이로드되면 콜백 함수가 json어떤 값으로 설정 되지만 그 당시에는 아무도 신경 쓰지 않습니다.

    이 문제를 'async': false. 이것이 작동하는지 확인하려면 다음 줄을 코드에 추가하고 브라우저의 콘솔을 확인하십시오.

    console.log(['json', json]);
  2. 경로가 잘못되었을 수 있습니다. HTML 문서에서 스크립트를로드하는 데 사용한 것과 동일한 경로를 사용하십시오. 따라서 스크립트가 js/script.js이면js/content.json

    일부 브라우저에서는 액세스를 시도한 URL과 액세스 방법 (성공 / 오류 코드, HTML 헤더 등)을 표시 할 수 있습니다. 브라우저의 개발 도구를 확인하여 어떤 일이 발생하는지 확인하십시오.


그의 버전의 jquery가 아직 이것을 지원하지 않을 수 있습니까? 문구를 개선했습니다.
아론 Digulla

4

내장 node.js 모듈 fs 는 필요에 따라 비동기식 또는 동기식으로 수행합니다.

다음을 사용하여로드 할 수 있습니다. var fs = require('fs');

비동기

fs.readFile('./content.json', (err, data) => {
    if (err)
      console.log(err);
    else {
      var json = JSON.parse(data);
    //your code using json object
    }
})

동기식

var json = JSON.parse(fs.readFileSync('./content.json').toString());

-1

~ / my-app / src / db / abc.json 파일에서와 같이 주어진 json 형식의 경우 :

  [
      {
        "name":"Ankit",
        "id":1
      },
      {
        "name":"Aditi",
        "id":2
      },
      {
        "name":"Avani",
        "id":3
      }
  ]

~ / my-app / src / app.js와 같은 .js 파일로 가져 오려면 다음을 수행하십시오.

 const json = require("./db/abc.json");

 class Arena extends React.Component{
   render(){
     return(
       json.map((user)=>
        {
          return(
            <div>{user.name}</div>
          )
        }
       )
      }
    );
   }
 }

 export default Arena;

산출:

Ankit Aditi Avani

이것은 여기에서 묻는 질문이 아닌 질문에 대한 답변입니다.
Kevin B

@KevinB 내 설명에 따라 .json 파일을 .js 파일로 가져 왔습니다. 이것은 json-file을 const json에로드하는 데 도움이되었습니다. 여기에서 사용자 속성 등에 대해 다음 json 사전을 사용할 수 있습니다.
Ank_247shbm

하지만이 질문은 사용자가 객체 리터럴을 .json 파일로 복사 한 다음 ajax로로드하려는 사용자에 관한 것입니다. 객체 리터럴은 JSON에 유효하지 않은 형식이었습니다. react를 설치하고 require와 함께 가져 오면 어떤 경우에는 확실히 작동하지만 경우에는 도움 되지 않습니다 .
Kevin B

참고로 다른 모든 답변에이 답변에 대한 댓글을 게시하는 것은 과도한 자기 홍보로 간주 될 수 있으며 답변을 편집하려는 시도는 기물 파손 행위입니다. 댓글이 삭제되었습니다. 다시는 이와 같이 수정하지 마세요.
Brad Larson

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