javascript - Node.js का उपयोग कर JSON का विश्लेषण कैसे करें?




(18)

Node.js का उपयोग करके JSON को कैसे पार्स करना चाहिए? क्या कोई मॉड्यूल है जो JSON को सुरक्षित रूप से मान्य और पार्स करेगा?

https://code.i-harness.com


JSON.parse आपके द्वारा पार्सिंग की जेसन स्ट्रिंग की सुरक्षा सुनिश्चित नहीं करेगा। आपको json-safe-parse या इसी तरह की लाइब्रेरी जैसी लाइब्रेरी देखना चाहिए।

जेसन-सेफ-पार्स एनपीएम पेज से:

JSON.parse बहुत अच्छा है, लेकिन जावास्क्रिप्ट के संदर्भ में इसकी एक गंभीर दोष है: यह आपको विरासत गुणों को ओवरराइड करने की अनुमति देता है। यह एक मुद्दा बन सकता है यदि आप किसी अविश्वसनीय स्रोत से JSON को पार्स कर रहे हैं (उदाहरण: एक उपयोगकर्ता), और उस पर कॉलिंग फ़ंक्शंस आप मौजूद होने की उम्मीद करेंगे।


JSON.parse का एक और उदाहरण:

var fs = require('fs');
var file = __dirname + '/config.json';

fs.readFile(file, 'utf8', function (err, data) {
  if (err) {
    console.log('Error: ' + err);
    return;
  }

  data = JSON.parse(data);

  console.dir(data);
});

आप JSON.parse () का उपयोग कर सकते हैं (जो एक फ़ंक्शन में बनाया गया है जो शायद आपको इसे ट्राई-कैच स्टेटमेंट्स से लपेटने के लिए मजबूर करेगा)।

या कुछ JSON पार्सिंग एनपीएम लाइब्रेरी का उपयोग करें, जेसन json-parse-or जैसे कुछ


इसे यथासंभव जटिल बनाने के लिए, और जितना संभव हो सके उतने पैकेज लाएं ...

const fs = require('fs');
const bluebird = require('bluebird');
const _ = require('lodash');
const readTextFile = _.partial(bluebird.promisify(fs.readFile), _, {encoding:'utf8',flag:'r'});
const readJsonFile = filename => readTextFile(filename).then(JSON.parse);

यह आपको करने देता है:

var dataPromise = readJsonFile("foo.json");
dataPromise.then(console.log);

या यदि आप async / await का उपयोग कर रहे हैं:

let data = await readJsonFile("foo.json");

readFileSync का उपयोग करने पर लाभ यह है कि फ़ाइल को डिस्क से पढ़ने के दौरान आपका नोड सर्वर अन्य अनुरोधों को संसाधित कर सकता है।


चूंकि आप नहीं जानते कि आपकी स्ट्रिंग वास्तव में मान्य है, मैं इसे पहले कोशिश करने के लिए रखूंगा। इसके अलावा, पकड़ने वाले ब्लॉक को नोड द्वारा अनुकूलित नहीं किया जाता है, इसलिए मैं पूरी चीज को किसी अन्य फ़ंक्शन में डाल दूंगा:

function tryParseJson(str) {
    try {
        return JSON.parse(str);
    } catch (ex) {
        return null;
    }
}

या "async शैली" में

function tryParseJson(str, callback) {
    process.nextTick(function () {
      try {
          callback(null, JSON.parse(str));
      } catch (ex) {
          callback(ex)
      }
    })
}

जैसा कि यहां अन्य उत्तरों का उल्लेख किया गया है, आप शायद स्थानीय जेएसओ फ़ाइल की आवश्यकता चाहते हैं जो आपको पता है कि कॉन्फ़िगरेशन फ़ाइल की तरह सुरक्षित और वर्तमान है:

var objectFromRequire = require('path/to/my/config.json'); 

या किसी ऑब्जेक्ट में स्ट्रिंग मान को पार्स करने के लिए वैश्विक JSON ऑब्जेक्ट का उपयोग करने के लिए:

var stringContainingJson = '\"json that is obtained from somewhere\"';
var objectFromParse = JSON.parse(stringContainingJson);

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

यहां, मैंने एक डेमो प्रकाशित किया है जहां आप दोनों विधियों को देख सकते हैं और उनके साथ ऑनलाइन खेल सकते हैं (पार्सिंग उदाहरण app.js फ़ाइल में है - फिर रन बटन पर क्लिक करें और परिणाम टर्मिनल में देखें): http://staging1.codefresh.io/labs/api/env/json-parse-example

आप कोड को संशोधित कर सकते हैं और प्रभाव देख सकते हैं ...


मेरा समाधान:

var fs = require('fs');
var file = __dirname + '/config.json';

fs.readFile(file, 'utf8', function (err, data) {
    if (err) {
        console.log('Error: ' + err);
        return;
    }

    data = JSON.parse(data);

    console.dir(data);
});

मैं उल्लेख करना चाहता हूं कि वैश्विक JSON ऑब्जेक्ट के विकल्प हैं। JSON.parse और JSON.stringify दोनों सिंक्रोनस हैं, इसलिए यदि आप बड़ी वस्तुओं से निपटना चाहते हैं तो आप कुछ एसिंक्रोनस JSON मॉड्यूल को देखना चाहेंगे।

एक नज़र डालें: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json


यह आसान है, आप JSON.stringify(json_obj) का उपयोग कर JSON को स्ट्रिंग में परिवर्तित कर सकते हैं, और JSON.parse("your json string") का उपयोग कर स्ट्रिंग को JSON में परिवर्तित कर JSON.parse("your json string")


यह मुझे चिल्लाया जाना था: यह केवल .json फ़ाइलों के लिए काम करता है।

अगर फ़ाइल समाप्त हो रही है तो यह काम नहीं करता है!


लीवरेज लोडाश का प्रयास एक त्रुटि ऑब्जेक्ट को वापस करने के लिए फ़ंक्शन करता है, जिसे आप isError फ़ंक्शन के साथ संभाल सकते हैं।

// Returns an error object on failure
function parseJSON(jsonString) {
   return _.attempt(JSON.parse.bind(null, jsonString));
}


// Example Usage
var goodJson = '{"id":123}';
var badJson = '{id:123}';
var goodResult = parseJSON(goodJson);
var badResult = parseJSON(badJson);

if (_.isError(goodResult)) {
   console.log('goodResult: handle error');
} else {
   console.log('goodResult: continue processing');
}
// > goodResult: continue processing

if (_.isError(badResult)) {
   console.log('badResult: handle error');
} else {
   console.log('badResult: continue processing');
}
// > badResult: handle error

सुरक्षित पक्ष पर रहने के लिए इसका इस्तेमाल करें

var डेटा = JSON.parse (Buffer.concat (arr) .toString ());



node-fs पुस्तकालय शामिल करें।

var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));

'एफएस' लाइब्रेरी पर अधिक जानकारी के लिए, http://nodejs.org/api/fs.html पर दस्तावेज़ देखें


आप JSON.parse उपयोग कर सकते हैं

आप किसी भी ईसीएमएस्क्रिप्ट 5 संगत जावास्क्रिप्ट कार्यान्वयन पर JSON ऑब्जेक्ट का उपयोग करने में सक्षम होना चाहिए। और V8 , जिस पर नोड.जेएस बनाया गया है उनमें से एक है।

जेएसओएन डेटा युक्त स्ट्रिंग को पार्स करना

var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);

JSON डेटा वाली फ़ाइल को पार्स करना

आपको fs मॉड्यूल के साथ कुछ फाइल ऑपरेशंस करना होगा।

असीमित संस्करण

var fs = require('fs');

fs.readFile('/path/to/file.json', 'utf8', function (err, data) {
    if (err) throw err; // we'll not consider error handling for now
    var obj = JSON.parse(data);
});

तुल्यकालिक संस्करण

var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));

आप require उपयोग करना चाहते हैं? फिर से विचार करना!

आप कभी-कभी require उपयोग कर सकते हैं :

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

लेकिन, मैं कई कारणों से इसकी अनुशंसा नहीं करता हूं:

नोट: यदि आप संवेदनशील जानकारी (जैसे पासवर्ड) स्टोर करने के लिए JSON फ़ाइल का उपयोग कर रहे हैं, तो ऐसा करने का गलत तरीका है। देखें कि हेरोोकू यह कैसे करता है: https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application एप्लिकेशन। पता लगाएं कि आपका प्लेटफॉर्म कैसा करता है, और कोड के भीतर से कॉन्फ़िगर वर्र्स को पुनर्प्राप्त करने के लिए process.env का उपयोग करें।

  1. require तुल्यकालिक है। यदि आपके पास एक बहुत बड़ी JSON फ़ाइल है, तो यह आपके ईवेंट लूप को चकित करेगी। आपको वास्तव में JSON.parse साथ fs.readFile का उपयोग करने की आवश्यकता है।
  2. require केवल फाइल को एक बार पढ़ा जाएगा। उसी फ़ाइल के लिए require कॉल करने के लिए बाद में कॉल कैश की गई प्रतिलिपि वापस कर देंगे। यदि आप एक .json फ़ाइल को लगातार अद्यतन करना चाहते हैं तो एक अच्छा विचार नहीं है। आप एक हैक का उपयोग कर सकते हैं। लेकिन इस बिंदु पर, बस fs उपयोग करना आसान है।
  3. यदि आपकी फ़ाइल में .json एक्सटेंशन नहीं है, तो फ़ाइल की सामग्री JSON के रूप में नहीं मानी जाएगी।

गंभीरता से! JSON.parse प्रयोग करें

jsonfile मॉड्यूल

यदि आप बड़ी संख्या में .json फ़ाइलों को पढ़ रहे हैं, (और यदि आप बेहद आलसी हैं), तो हर बार बॉयलरप्लेट कोड लिखना परेशान हो जाता है। आप jsonfile मॉड्यूल का उपयोग कर कुछ पात्रों को बचा सकते हैं।

var jf = require('jsonfile');

असीमित संस्करण

jf.readFile('/path/to/file.json', function(err, obj) {
  // obj contains JSON data
});

तुल्यकालिक संस्करण

var obj = jf.readFileSync('/path/to/file.json');

धाराओं से JSON पार्सिंग

यदि जेएसओएन सामग्री नेटवर्क पर स्ट्रीम की जाती है, तो आपको एक स्ट्रीमिंग JSON पार्सर का उपयोग करने की आवश्यकता है। अन्यथा यह आपके प्रोसेसर को बांध देगा और आपके ईवेंट लूप को तब तक दबाएगा जब तक कि JSON सामग्री पूरी तरह से स्ट्रीम न हो जाए।

इसके लिए एनपीएम में बहुत सारे पैकेज उपलब्ध हैं । चुनें कि आपके लिए सबसे अच्छा क्या है।

त्रुटि हैंडलिंग / सुरक्षा

यदि आप अनिश्चित हैं कि जो भी JSON.parse() को पास किया गया है , वह वैध JSON है , तो कोशिश करें कि JSON.parse() को कॉल try/catch ब्लॉक के अंदर कॉल संलग्न करें। एक उपयोगकर्ता प्रदान करता है जो JSON स्ट्रिंग आपके एप्लिकेशन को क्रैश कर सकता है, और यहां तक ​​कि सुरक्षा छेद भी ले सकता है। सुनिश्चित करें कि अगर आप बाहरी रूप से प्रदत्त JSON को पार्स करते हैं तो त्रुटि प्रबंधन किया जाता है।


आप बस JSON.parse उपयोग कर सकते हैं।

node.js V8 पर बनाया गया है, जो वैश्विक ऑब्जेक्ट JSON[docs] प्रदान करता है। JSON ऑब्जेक्ट की परिभाषा ईसीएमएस्क्रिप्ट 5 विनिर्देश का हिस्सा है

नोट - JSON.parse वर्तमान थ्रेड को JSON.parse सकता है क्योंकि यह एक तुल्यकालिक विधि है। तो यदि आप बड़ी JSON ऑब्जेक्ट्स को पार्स करने की योजना बना रहे हैं तो स्ट्रीमिंग जेसन पार्सर का उपयोग करें।


var array={
    Action: 'Login',
    ErrorCode: 3,
    Detail: 'Your account not found.'
};
var http=require('http'),
    PORT=8789,
    server=function(req,res){
        res.writeHead(200,{'Content-Type':'application/json'});

        // JSON
        res.end(JSON.stringify(array));
    }

http.createServer(server).listen(PORT);
console.log('Server started.');

var fs = require('fs');

fs.readFile('ashish.json',{encoding:'utf8'},function(data,err) {

   if(err) 
      throw err;

   else {

   console.log(data.toString());

 }
})




node.js