json 파일의 값을 업데이트하고 node.js를 통해 저장하는 방법


84

json 파일의 값을 업데이트하고 node.js를 통해 저장하려면 어떻게해야합니까? 파일 내용이 있습니다.

var file_content = fs.readFileSync(filename);
var content = JSON.parse(file_content);
var val1 = content.val1;

이제 값을 변경 val1하여 파일에 저장 하고 싶습니다 .

답변:


127

이를 비동기 적으로 수행하는 것은 매우 쉽습니다. 스레드 차단이 우려되는 경우 특히 유용합니다.

const fs = require('fs');
const fileName = './file.json';
const file = require(fileName);
    
file.key = "new value";
    
fs.writeFile(fileName, JSON.stringify(file), function writeJSON(err) {
  if (err) return console.log(err);
  console.log(JSON.stringify(file));
  console.log('writing to ' + fileName);
});

주의 할 점은 json이 파일에 한 줄로 작성되고 예쁘지 않다는 것입니다. 전의:

{
  "key": "value"
}

될거야...

{"key": "value"}

이를 방지하려면 다음 두 개의 추가 인수를 JSON.stringify

JSON.stringify(file, null, 2)

null-대체 기능을 나타냅니다. (이 경우 우리는 프로세스를 변경하고 싶지 않습니다)

2 -들여 쓰기 할 공백을 나타냅니다.


50
//change the value in the in-memory object
content.val1 = 42;
//Serialize as JSON and Write it to a file
fs.writeFileSync(filename, JSON.stringify(content));

6
전반적으로 Node.js의 주요 초점이므로 비동기 쓰기를 사용하는 것이 좋습니다. 물론 주변 코드를 보지 않고는 확실한 답을 제공하기 어려울 것입니다. 쓰기가 완료 될 때까지 다른 일이 일어나지 않는다는 것을 절대적으로 확신 할 필요가 없다면 정말 동기화가 필요하지 않을 것입니다. 또한 물론 파일 쓰기가 성공할 것이라고 확신 할 수 없기 때문에 오류 검사기가 있어야합니다.
Julian Knight

4
비동기와 동기화는 정확히 어떤 상황에서 무엇을하는지에 따라 다릅니다. 이것이 네트워크 서비스에 있다면 비동기가 필요합니다. 명령 줄 유틸리티의 경우 대부분의 간단한 경우에 동기화가 적절한 패러다임이지만 "비동기 화가 더 낫다"고 말하는 것은 옳지 않습니다. 내 스 니펫은 컨텍스트에 대한 OP 스 니펫을 기반으로합니다. 문제는 또한 오류 처리에 관한 것이 아니며 파일 쓰기가 실패하는 경우 스택 추적으로 종료하는 것이 합리적인 기본 동작입니다. 복구 할 수있는 작업이 많지 않기 때문입니다.
Peter Lyons 2015

노드는 루프 기반이기 때문에 비동기는 거의 항상 더 좋으므로 루프를 차단하지 않습니다. 이것은 전혀 무릎을 꿇는 반응이 아니며 단순히 노드 Dev의 표준 관행입니다. 이미 요구 사항에 따라 다르며 Q가 명령 줄에 대해 아무 말도하지 않는다고 생각합니까? 또한 일반적으로 이것이 더 큰 코드 세트의 일부인 경우 (OP에 의해 명확하지 않음) 오류 처리는 항상 현명하고 모범 사례입니다. 스택 추적을 덤프하는 것은 개발자에게는 괜찮지 만 다른 모든 사람들에게는 쓰레기입니다.
Julian Knight

22
비동기는 동시성 기술입니다. 동시성이 필요한 경우 노드가 제대로 작동하려면 비동기가 필요합니다 ( "더 나은"아님). 동시성이 없으면 비동기가 필요하지 않습니다. 요점은 async가 당신을 위해 무엇을하고 왜 그 이유를 이해해야한다는 것입니다. 이유없이 본질적으로 "더 나은"것은 아니며 "모범 사례"로 기억할 필요가 없습니다. OP가 JSON 파일을 변경하기 위해 명령 줄 유틸리티를 작성하고 종료하는 경우 비동기는 동시성이 필요하지 않으므로 코드를 복잡하게 만듭니다.
Peter Lyons

노드 명령 줄 도구를 만들고 있습니다. 동기화되지 않은 경우 내 도구의 출력이 다음 도구에 연결될 때 파일이 잠길 수 있습니다. 동기화를 사용하는 데에는 아주 좋은 이유가 있습니다. 그리고 비동기를 사용하는 좋은 이유.
TamusJRoyce

3

쓰기 작업을 위해 이전 응답 추가 파일 경로 디렉토리에 추가

 fs.writeFile(path.join(__dirname,jsonPath), JSON.stringify(newFileData), function (err) {}

2
// read file and make object
let content = JSON.parse(fs.readFileSync('file.json', 'utf8'));
// edit or add property
content.expiry_date = 999999999999;
//write file
fs.writeFileSync('file.json', JSON.stringify(content));

0

json 컬렉션에 항목을 추가하려는 사람들을 위해

function save(item, path = './collection.json'){
    if (!fs.existsSync(path)) {
        fs.writeFile(path, JSON.stringify([item]));
    } else {
        var data = fs.readFileSync(path, 'utf8');  
        var list = (data.length) ? JSON.parse(data): [];
        if (list instanceof Array) list.push(item)
        else list = [item]  
        fs.writeFileSync(path, JSON.stringify(list));
    }
}

0

다른 동시 작업을 보유 하므로 동기 (차단) 기능을 사용하지 않는 것이 좋습니다 . 대신 비동기 fs.promises를 사용 하십시오 .

const fs = require('fs').promises

const setValue = (fn, value) => 
  fs.readFile(fn)
    .then(body => JSON.parse(body))
    .then(json => {
      // manipulate your data here
      json.value = value
      return json
    })
    .then(json => JSON.stringify(json))
    .then(body => fs.writeFile(fn, body))
    .catch(error => console.warn(error))

setValue보류중인 promise 를 반환하는 Remeber의 경우 .then 함수 또는 비동기 함수 내에서 await 연산자 를 사용해야 합니다.

// await operator
await setValue('temp.json', 1)           // save "value": 1
await setValue('temp.json', 2)           // then "value": 2
await setValue('temp.json', 3)           // then "value": 3

// then-sequence
setValue('temp.json', 1)                 // save "value": 1
  .then(() => setValue('temp.json', 2))  // then save "value": 2
  .then(() => setValue('temp.json', 3))  // then save "value": 3

0

작업 완료 후 데이터 저장

fs.readFile("./sample.json", 'utf8', function readFileCallback(err, data) {
        if (err) {
          console.log(err);
        } else {
          fs.writeFile("./sample.json", JSON.stringify(result), 'utf8', err => {
            if (err) throw err;
            console.log('File has been saved!');
          });
        }
      });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.