किसी json फ़ाइल में मान को कैसे अपडेट करें और इसे node.js के माध्यम से सहेजें


84

मैं एक json फ़ाइल में मान कैसे अपडेट करूं और इसे नोड.जेएस के माध्यम से सहेजूं? मेरे पास फ़ाइल सामग्री है:

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);
});

कैविएट यह है कि एक लाइन पर फाइल को लिखा जाता है, न कि प्रीट्रीफाइड। उदाहरण के लिए:

{
  "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
कुल मिलाकर, async लेखन का उपयोग करना बेहतर होगा क्योंकि यह नोड का मुख्य फोकस है। बेशक, आसपास के कोड को देखे बिना निश्चित उत्तर देना कठिन होगा। यह संभावना नहीं है कि आपको वास्तव में एक सिंक की आवश्यकता होगी जब तक कि आपको पूरी तरह से सुनिश्चित करने की आवश्यकता न हो कि जब तक लेखन पूरा नहीं हो जाता है तब तक कुछ और नहीं हो सकता है। इसके अतिरिक्त, निश्चित रूप से, इसमें एक त्रुटि चेकर होना चाहिए क्योंकि आप यह सुनिश्चित कर सकते हैं कि एक फ़ाइल लिखना सफल होगा।
जूलियन नाइट

4
async बनाम सिंक वास्तव में इस बात पर निर्भर करता है कि आप किस संदर्भ में क्या कर रहे हैं। यदि यह एक नेटवर्क सेवा में है, तो आपको async की आवश्यकता है। कमांड लाइन उपयोगिता के लिए, सबसे सरल मामलों में सिंक उपयुक्त प्रतिमान है, लेकिन सिर्फ घुटने के बल "यह async बेहतर है" कहना सही नहीं है। मेरा स्निपेट संदर्भ के लिए ओपी स्निपेट पर आधारित है। प्रश्न त्रुटि से निपटने के बारे में भी नहीं है और यदि फ़ाइल लिखना विफल रहता है, तो स्टैक ट्रेस से बाहर निकलना उचित डिफ़ॉल्ट व्यवहार है क्योंकि इससे उबरने के लिए आप बहुत कुछ नहीं कर सकते हैं।
पीटर ल्योन

क्योंकि नोड लूप आधारित है, इसलिए async लगभग हमेशा बेहतर होता है इसलिए आप लूप को ब्लॉक नहीं करते हैं, यह बिल्कुल भी घुटने की प्रतिक्रिया नहीं है, केवल नोड देव के लिए मानक अभ्यास। मैंने पहले ही कहा कि यह आवश्यकता पर निर्भर करता है और मुझे नहीं लगता कि Q कमांड लाइन के बारे में कुछ कहता है? सामान्य तौर पर, यदि यह कोड के एक बड़े सेट का हिस्सा है (ओपी द्वारा स्पष्ट नहीं किया गया है), तो त्रुटि हैंडलिंग हमेशा स्मार्ट और सबसे अच्छा अभ्यास है। स्टैक ट्रेस टाँगना देवों के लिए ठीक है लेकिन बाकी सभी के लिए बकवास है।
जूलियन नाइट

22
async एक संगामिति तकनीक है। यदि आपको समवर्ती की आवश्यकता है, तो नोड को ठीक से काम करने के लिए एसिंक्स की आवश्यकता है ("बेहतर" नहीं)। यदि आपके पास संगामिति नहीं है, तो आपको async की आवश्यकता नहीं है। मुद्दा यह है कि आपको वास्तव में यह समझने की आवश्यकता है कि आपके लिए एसिंक्स क्या करता है और क्यों। यह बिना किसी कारण के स्वाभाविक रूप से "बेहतर" नहीं है और आपको इसे "सर्वोत्तम अभ्यास" के रूप में याद रखने की आवश्यकता नहीं है। यदि ओपी एक JSON फ़ाइल को बदलने के लिए कमांड लाइन उपयोगिता लिख ​​रहा है, तो बाहर निकलें, async बिना किसी कारण के कोड को जटिल करता है क्योंकि संगामिति की आवश्यकता नहीं है।
पीटर ल्योन

मैं एक नोड कमांड लाइन उपकरण बना रहा हूं। यदि यह लिखा हुआ नहीं है, तो मेरे टूल का आउटपुट अगले टूल पर जंजीर होने पर फाइल लॉक हो सकती है। सिंक का उपयोग करने के लिए बहुत अच्छे कारण हैं। और async उपयोग करने के अच्छे कारण हैं।
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

जोन्स संग्रह में एक आइटम जोड़ने के लिए देख रहे लोगों के लिए

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एक लंबित वादे को लौटाता है, आपको उपयोग करने की आवश्यकता होगी। फ़ंक्शन या async फ़ंक्शन के भीतर, प्रतीक्षित ऑपरेटर

// 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!');
          });
        }
      });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.