কীভাবে কোনও জসন ফাইলে একটি মান আপডেট করবেন এবং নোড.জেএস এর মাধ্যমে সেভ করবেন


84

আমি কীভাবে একটি জসন ফাইলে একটি মান আপডেট করব এবং এটিকে নোড.জেএস এর মাধ্যমে সংরক্ষণ করব? আমার কাছে ফাইলের সামগ্রী রয়েছে:

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

এখন আমি এর মান পরিবর্তন করতে val1এবং এটিকে ফাইলটিতে সংরক্ষণ করতে চাই।

উত্তর:


130

এটি অ্যাসিঙ্ক্রোনালিভাবে করা বেশ সহজ। এটি বিশেষত কার্যকর যদি আপনি থ্রেড (সম্ভাব্য) অবরুদ্ধ করার জন্য উদ্বিগ্ন হন।

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- replacer ফাংশন প্রতিনিধিত্ব করে। (এই ক্ষেত্রে আমরা প্রক্রিয়াটি পরিবর্তন করতে চাই না)

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
সামগ্রিকভাবে, অ্যাসিঙ্ক রচনাটি ব্যবহার করা ভাল হবে কারণ এটি নোডের মূল ফোকাস। অবশ্যই, আশেপাশের কোডটি না দেখে একটি নির্দিষ্ট উত্তর দেওয়া শক্ত হবে। আপনার লেখাটি সম্পূর্ণ না হওয়া অবধি অন্য কিছু ঘটতে পারে না এমন বিষয়ে নিশ্চিত হওয়ার দরকার না থাকলে আপনার সত্যিকারের একটি সিঙ্কের প্রয়োজন হবে না। অতিরিক্তভাবে, অবশ্যই, এটির একটি ত্রুটি পরীক্ষক হওয়া উচিত কারণ আপনি কোনও ফাইল রাইটিং সফল হবে তা নিশ্চিত হতে পারেন না।
জুলিয়ান নাইট

4
অ্যাসিঙ্ক বনাম সিঙ্ক আপনি কোন প্রসঙ্গে যা করছেন তার উপর নির্ভর করে। এটি যদি কোনও নেটওয়ার্ক পরিষেবাদিতে থাকে তবে আপনার অ্যাসিঙ্ক দরকার। কমান্ড লাইন ইউটিলিটির জন্য, সিঙ্ক হ'ল বেশিরভাগ সাধারণ ক্ষেত্রে উপযুক্ত দৃষ্টান্ত, তবে কেবল "অ্যাসিঙ্ক ভাল" "বলার জন্য হাঁটু-জার্ক সঠিক নয়। আমার স্নিপেট প্রসঙ্গের জন্য ওপি স্নিপেটের উপর ভিত্তি করে। প্রশ্নটি ত্রুটি পরিচালনা করার ক্ষেত্রেও নয় এবং যদি ফাইলটি লেখার ব্যর্থ হয় তবে স্ট্যাক ট্রেসের সাহায্যে প্রস্থান করা যুক্তিসঙ্গত ডিফল্ট আচরণ কারণ কারণ এর থেকে পুনরুদ্ধার করার জন্য আপনার বেশি কিছু করার নেই।
পিটার লিয়নস

নোড লুপ ভিত্তিক হওয়ার কারণে, অ্যাসিঙ্ক প্রায় সর্বদা ভাল তাই আপনি লুপটি ব্লক করবেন না, এটি কোনও হাঁটু-ঝাঁকির প্রতিক্রিয়া নয়, নোড দেবের জন্য কেবল স্ট্যান্ডার্ড অনুশীলন। আমি ইতিমধ্যে বলেছি যে এটি প্রয়োজনীয়তার উপর নির্ভর করে এবং আমি মনে করি না প্রশ্নটি কমান্ড লাইন সম্পর্কে কিছু বলে? এছাড়াও সাধারণভাবে, যদি এটি কোনও কোডের বৃহত্তর সেট (ওপি দ্বারা স্পষ্ট করা হয় না) এর অংশ হয়, তবে ত্রুটি পরিচালনা করা সর্বদা স্মার্ট এবং সেরা অনুশীলন। স্ট্যাকের ট্রেস ডাম্পিং করা ডেভসের পক্ষে ঠিক তবে অন্য সবার জন্য বোকা।
জুলিয়ান নাইট

23
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

আমি দৃ strongly়ভাবে সিঙ্ক্রোনাস (ব্লকিং) ফাংশনগুলি ব্যবহার না করার পরামর্শ দিচ্ছি, কারণ তারা অন্যান্য সমবর্তী ক্রিয়াকলাপগুলি ধরে রাখে । পরিবর্তে, অ্যাসিঙ্ক্রোনাস fs. প্রোফাইলগুলি ব্যবহার করুন :

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একটি মুলতুবি প্রতিশ্রুতি ফিরিয়ে দেয়, আপনাকে ব্যবহার করতে হবে .এই ফাংশন বা, অ্যাসিঙ্ক ফাংশনগুলির মধ্যে অপেক্ষা অপারেটর

// 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.