Node.JS का उपयोग करते हुए, मैं एक JSON फ़ाइल को (सर्वर) मेमोरी में कैसे पढ़ूं?


618

पृष्ठभूमि

मैं Node.js के साथ कुछ प्रयोग कर रहा हूं और एक JSON ऑब्जेक्ट पढ़ना चाहता हूं, या तो एक टेक्स्ट फ़ाइल या एक .js फ़ाइल (जो बेहतर है ??) को स्मृति में। ताकि मैं उस ऑब्जेक्ट को कोड से जल्दी से एक्सेस कर सकूं। मुझे महसूस होता है कि वहाँ से मोंगो, अल्फ्रेड आदि चीजें हैं, लेकिन अभी मुझे जो चाहिए वह नहीं है।

सवाल

मैं जावास्क्रिप्ट या नोड का उपयोग करके किसी पाठ या js फ़ाइल से बाहर एक JSON ऑब्जेक्ट और सर्वर मेमोरी में कैसे पढ़ूं?


1
आप सर्वर मेमोरी को क्या कहते हैं? जब तक आप इसे काम नहीं करेंगे तब तक आपका नोडज स्क्रिप्ट काम करेगा, लेकिन जब तक आप नोड्ज स्क्रिप्ट को स्थिर नहीं करेंगे तब तक आपको डेटा कहीं स्टोर करना होगा।
mpm

जवाबों:


1204

सिंक:

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

async:

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 से है, जिसका अर्थ है कि Async तरीके से भी, लोगों को बड़ी JSON फ़ाइलों से सावधान रहना होगा। चूंकि यह नोड को बांध देगा।
सीन_ए

25
परिपूर्णता के लिए। उनके पास एक npm मौजूद है जिसे jsonfile कहा जाता है ।
स्टेफेन

5
मुझे विश्वास नहीं हो रहा है कि इस साधारण सी चीज़ को ढूंढना इतना मुश्किल था। मुझे Google से प्राप्त हर उत्तर एक HTTPRequest कर रहा था या JQuery का उपयोग कर रहा था या ब्राउज़र में कर रहा था
juliangonzalez

6
दो बिंदु: (1) समकालिक उत्तर होना चाहिए let imported = require("file.json")। (2) JSON.parse अतुल्यकालिक होना चाहिए, क्योंकि मैंने इस कोड का उपयोग एक ऑब्जेक्ट के रूप में 70mb JSON फाइल को मेमोरी में लोड करने के लिए किया था। यह इस तरह से मिलीसेकंड लेता है, लेकिन अगर मैं उपयोग करता हूं require(), तो यह चुगता है
काइल बेकर

8
इस उत्तर को 2019 और उसके बाद खोजने वाले लोगों के लिए, Node.js को कई, कई संस्करणों के लिए देशी json समर्थन मिला है require, इस उत्तर के साथ अब लागू नहीं किया जा रहा है यदि आप बस एक json फ़ाइल लोड करना चाहते हैं। बस उपयोग करें let data = require('./yourjsonfile.json')और आप जाएं (बुकनोट के साथ कि यदि आवश्यकता का प्रदर्शन आपके कोड को प्रभावित कर रहा है, तो आपको "
ajson

392

ऐसा करने के लिए मैंने जो सबसे आसान तरीका खोजा है वह है सिर्फ requireअपनी JSON फाइल का उपयोग करना और पथ।

उदाहरण के लिए, मान लें कि आपके पास निम्न JSON फ़ाइल है।

test.json

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

फिर आप आसानी से इसे अपने नोड.जेएस एप्लिकेशन में लोड कर सकते हैं require

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

35
बस इतना ही लोग जानते हैं, और अगर मुझे सही से याद है, तो requireनोड में सिंक्रोनस चलता है। यहाँ
लगाओ

@ राम यह मेरे लिए काम करता है आपका स्थान test.jsonउसके उदाहरण से अलग होगा। मैं उपयोग कर रहा हूँnode 5.0
guleria

18
इस तरह की विधि के साथ एक और मुद्दा / लाभ यह तथ्य है कि आवश्यक डेटा कैश किया जाता है जब तक कि आप विशेष रूप से कैश किए गए इंस्टेंस को नहीं हटाते हैं
मैजिकोड 1111

13
"आवश्यकता" का उपयोग आपके एप्लिकेशन के जीवन काल के माध्यम से उपयोग किए जा रहे मॉड्यूल या कॉन्फ़िगरेशन फ़ाइल को लोड करने के लिए किया जाना है। फ़ाइलों को लोड करने के लिए इसका उपयोग करना सही नहीं लगता है।
याकी क्लेन

2
मैं कहूंगा कि यह संभावित रूप से एक सुरक्षा खतरा है। यदि आपके द्वारा लोड की जा रही json फाइल में JS कोड है, तो क्या requireयह उस कोड को चलाएगा? यदि हां, तो आपको वास्तव में यह नियंत्रित करने की आवश्यकता है कि आपकी जसन फाइलें कहां से आ रही हैं या एक हमलावर आपकी मशीन पर दुर्भावनापूर्ण कोड चला सकता है।
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
सहमत :), async साथ ही जोड़ा
mihai

1
महान :-) मुझे इनलाइन कॉलबैक पसंद नहीं है, हालांकि, यह कॉलबैक बुरे सपने पैदा कर सकता है जो मैं नहीं चाहता।
फ्लोरियन मार्गाइन

9
यह एक कारण के लिए है .. जब तक आप इसे समान रूप से नहीं चाहते हैं।
मैट स्टीफंस

40

कम से कम नोड v8.9.1 में, आप बस कर सकते हैं

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

और JSON ऑब्जेक्ट के सभी तत्वों को एक्सेस करें।


5
यह दृष्टिकोण फ़ाइल को केवल एक बार लोड करता है। यदि आप file.jsonनई आवश्यकता के बाद (प्रोग्राम को पुनरारंभ किए बिना) डेटा को पहले लोड से बदल देंगे। मेरे पास इसे वापस करने के लिए स्रोत नहीं है, लेकिन मेरे पास ऐप में यह है जो मैं निर्माण कर रहा हूं
लुकास इग्नाटाविकियस

आपका उत्तर बहुत अधूरा है। जो आपको मिलता है वह एक वस्तु है, और यह tostring () को लागू करने के लिए भी परेशान नहीं करता है।
डेविड ए। ग्रे

3
@ DavidA.Gray सवाल वस्तुओं को वस्तुओं के रूप में उपयोग करने में सक्षम होना चाहता है, न कि तार के रूप में। एकल के मुद्दे पर लुकास ने उल्लेख किया कि यह उत्तर ठीक है।
मिकमेकाना

2
आवश्यकता का उपयोग करके फ़ाइल में मनमाने कोड को भी निष्पादित किया जाएगा। यह तरीका असुरक्षित है और मैं इसके खिलाफ सिफारिश करूंगा।
स्पूल्सन

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
अनटेरस

यदि आप वादों का उपयोग करना चाहते हैं, तो fs/promisesनोड 10 के रूप में भी है । ध्यान दें: एपीआई प्रयोगात्मक है: नोडज्स.org
fs.html#

@Aternus .readFileहै अतुल्यकालिक , लेकिन नहीं async। अर्थ, फ़ंक्शन asyncकीवर्ड के साथ परिभाषित नहीं है , और न ही यह एक वादा लौटाता है, इसलिए आप ऐसा नहीं कर सकते हैंawait fs.readFile('whatever.json');
किप

@ कैसे एक CodeSandBox के बारे में?
अनंत

7

का उपयोग कर नोड FS-अतिरिक्त (async इंतजार)

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


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

2

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfile_file_options_callback

var fs = require('fs');  

fs.readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});  

// options
fs.readFile('/etc/passwd', 'utf8', callback);

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options

आप फाइल सिस्टम डॉक्स में Node.js के सभी उपयोग पा सकते हैं!
आशा है कि आप के लिए यह मदद!


0

इतने सारे जवाब, और किसी ने कभी भी सिंक बनाम एसिंक्स बनाम आवश्यकता की तुलना करने के लिए एक बेंचमार्क नहीं बनाया। मैंने आवश्यकता के माध्यम से मेमोरी में रीडिंग जसन के उपयोग के मामलों में अंतर का वर्णन किया है, यहां रीडफाइलसिंक और रीडफाइल है


-1

यदि आप त्रुटि हैंडलिंग के साथ AsyncJSON फ़ाइल लोड करने के लिए एक पूर्ण समाधान की तलाश कर रहे हैं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 )
        }
   });
})

निर्देशिका संरचना:

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.