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.