Node.JS를 사용하여 JSON 파일을 (서버) 메모리로 어떻게 읽습니까?


618

배경

Node.js로 실험을하고 있으며 텍스트 파일이나 .js 파일 (더 나은 ??)에서 JSON 객체를 메모리로 읽어 코드에서 빠르게 객체에 액세스 할 수 있습니다. 나는 몽고, 알프레드 등과 같은 것들이 있다는 것을 알고 있지만 그것은 지금 내가 필요한 것이 아닙니다.

질문

JavaScript / 노드를 사용하여 텍스트 나 js 파일에서 서버 메모리로 JSON 객체를 읽으려면 어떻게해야합니까?


1
서버 메모리는 무엇입니까? nodejs 스크립트는 작동하는 한 작동하지만 nodejs 스크립트를 지속시키지 않으면 데이터를 어딘가에 저장해야합니다.
mpm

답변:


1205

동조:

var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));

비동기 :

var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});

15
JSON.parse는 v8에서 직접 동기화 된 것으로 생각합니다. 즉 비동기 방식으로도 사람들은 큰 JSON 파일에주의해야합니다. 노드를 묶을 것이기 때문입니다.
Sean_A91 4

25
완전성을 위해. jsonfile 이라는 npm이 있습니다 .
Stefan

5
나는이 단순한 것을 찾기가 너무 어렵다고 믿을 수 없다. Google에서 얻은 모든 답변은 HTTPRequest 또는 JQuery를 사용하거나 브라우저에서 수행하는 것입니다.
juliangonzalez

6
두 가지 점 : (1) 동기식 응답은이어야합니다 let imported = require("file.json"). (2)이 코드를 사용하여 70MB JSON 파일을 메모리에 객체로로드하기 때문에 JSON.parse는 비동기식이어야합니다. 그것은 밀리 초이 방법이 필요하지만 내가 사용하는 경우 require(), 그것은 마시기 .
Kyle Baker

8
2019 년 부터이 답변을 찾는 사람들을 위해 Node.js는를 통해 많은 버전에서 기본 json을 지원 require했으며 json 파일을로드하려는 경우이 답변을 더 이상 적용 할 수 없습니다. 그냥 사용 let data = require('./yourjsonfile.json')하고 나가십시오 (요청의 성능이 코드에 영향을 미치는 경우 ".json 파일을로드하고 싶지 않습니다"를 넘어서는 문제가 있음).
Mike 'Pomax'Kamermans

392

내가 찾은 가장 쉬운 방법은 requireJSON 파일의 경로와 경로를 사용 하는 것입니다.

예를 들어 다음 JSON 파일이 있다고 가정합니다.

test.json

{
  "firstName": "Joe",
  "lastName": "Smith"
}

그런 다음 이것을 사용하여 node.js 응용 프로그램에 쉽게로드 할 수 있습니다 require

var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);

35
그래서 사람들은 알고 있습니다. 그리고 정확하게 기억한다면 require노드에서 동기식으로 실행됩니다. 여기
prasanthv

@Ram 그것은 당신의 위치가 test.json그의 예와 다를 수도 있습니다 . 사용 중node 5.0
guleria

18
이러한 방법의 또 다른 문제 / 이점은 캐시 된 인스턴스를 구체적으로 삭제하지 않으면 필요한 데이터가 캐시된다는 것입니다.
magicode118

13
"필수"는 응용 프로그램 수명 동안 사용중인 모듈 또는 구성 파일을로드하는 데 사용됩니다. 이것을 사용하여 파일을로드하는 것이 옳지 않은 것 같습니다.
야키 클라인

2
이것이 잠재적 인 보안 위협이라고 말하고 싶습니다. 로드하는 json 파일에 JS 코드가 포함되어 require있으면 해당 코드를 실행합니까? 그렇다면 실제로 json 파일의 출처를 제어해야합니다. 그렇지 않으면 공격자가 컴퓨터에서 악성 코드를 실행할 수 있습니다.
sokkyoku

57

이유가 비동기식입니다! @mihai에서 돌을 던졌습니다.

그렇지 않으면 다음은 비동기 버전에서 사용한 코드입니다.

// Declare variables
var fs = require('fs'),
    obj

// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)

// Write the callback function
function handleFile(err, data) {
    if (err) throw err
    obj = JSON.parse(data)
    // You can now play with your datas
}

9
동의 :), 비동기 추가
mihai

1
Great :-) 인라인 콜백은 마음에 들지 않지만 콜백 악몽으로 이어질 수 있습니다.
Florian Margaine

9
동 기적으로 원하지 않는 한 이유가 있습니다.
매트 스티븐스

40

적어도 Node v8.9.1에서는 할 수 있습니다

var json_data = require('/path/to/local/file.json');

JSON 객체의 모든 요소에 액세스하십시오.


5
이 방법은 파일을 한 번만로드합니다. file.json새로운 요구 후 (프로그램 재시작없이)를 변경하면 첫 번째로드부터 데이터가 생성됩니다. 나는 이것을
뒷받침 할만한 자료

당신의 대답은 매우 불완전합니다. 당신을 얻는 것은 객체이며 tostring () 구현을 귀찮게하지 않습니다.
David A. Grey

3
@ DavidA.Gray이 질문은 문자열이 아닌 객체로 객체에 액세스 할 수 있기를 원합니다. Lukas는 싱글 톤 문제를 제외하고이 답변이 훌륭하다고 언급했습니다.
mikemaccana

2
require를 사용하면 파일에서 임의의 코드가 실행됩니다. 이 방법은 안전하지 않으므로 권장하지 않습니다.
spoulson

16

노드 8에서는 내장을 사용하여 다음 util.promisify()과 같은 파일을 비동기 적으로 읽을 수 있습니다

const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)

readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
  .then(contents => {
    const obj = JSON.parse(contents)
    console.log(obj)
  })
  .catch(error => {
    throw error
  })

3
.readFile동기화 버전을 찾고있는 경우 이름은 .readFileSync입니다.
Aternus

약속을 사용하려면 fs/promises노드 10 도 있습니다 . 참고 : API는 실험적입니다. nodejs.org/api/fs.html#fs_fs_promises_api
aboutaaron

@Aternus .readFile비동기식 이지만 비동기식async 입니다. 의미는, 기능은 async키워드로 정의되지 않았거나 약속을 반환하지 않습니다, 그래서 당신은 할 수 없습니다await fs.readFile('whatever.json');
Kip

@Kip CodeSandBox는 어떻습니까?
Aternus

7

하여 노드 FS-여분 (비동기 AWAIT)

const readJsonFile = async () => {
  try {
    const myJsonObject = await fs.readJson('./my_json_file.json');
    console.log(myJsonObject);
  } catch (err) {
    console.error(err)
  }
}

readJsonFile() // prints your json object

6

사용 FS를-추가 패키지는 매우 간단합니다 :

동조:

const fs = require('fs-extra')

const packageObj = fs.readJsonSync('./package.json')
console.log(packageObj.version) 

비동기 :

const fs = require('fs-extra')

const packageObj = await fs.readJson('./package.json')
console.log(packageObj.version) 

3
function parseIt(){
    return new Promise(function(res){
        try{
            var fs = require('fs');
            const dirPath = 'K:\\merge-xml-junit\\xml-results\\master.json';
            fs.readFile(dirPath,'utf8',function(err,data){
                if(err) throw err;
                res(data);
        })}
        catch(err){
            res(err);
        }
    });
}

async function test(){
    jsonData = await parseIt();
    var parsedJSON = JSON.parse(jsonData);
    var testSuite = parsedJSON['testsuites']['testsuite'];
    console.log(testSuite);
}

test();


0

많은 답변이 있으며 아무도 동기화 대 비동기 대 요구를 비교하기 위해 벤치 마크를 한 사람이 없습니다. require, readFileSync 및 readFile here을 통해 메모리에서 json을 읽는 유스 케이스의 차이점을 설명했습니다 .


-1

오류 처리를 Async통해 JSON 파일 을 로드 하기위한 완벽한 솔루션을 찾고 있다면Relative Path

  // Global variables
  // Request path module for relative path
    const path = require('path')
  // Request File System Module
   var fs = require('fs');


// GET request for the /list_user page.
router.get('/listUsers', function (req, res) {
   console.log("Got a GET request for list of users");

     // Create a relative path URL
    let reqPath = path.join(__dirname, '../mock/users.json');

    //Read JSON from relative path of this file
    fs.readFile(reqPath , 'utf8', function (err, data) {
        //Handle Error
       if(!err) {
         //Handle Success
          console.log("Success"+data);
         // Parse Data to JSON OR
          var jsonObj = JSON.parse(data)
         //Send back as Response
          res.end( data );
        }else {
           //Handle Error
           res.end("Error: "+err )
        }
   });
})

디렉토리 구조 :

여기에 이미지 설명을 입력하십시오

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