JSON को Node.js का उपयोग कैसे करें?


971

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

जवाबों:


1099

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

JSONऑब्जेक्ट की परिभाषा ECMAScript 5 विनिर्देश का हिस्सा है । नोड.जेएस गूगल क्रोम के वी 8 इंजन पर बनाया गया है , जो ईसीएमए मानक का पालन करता है। इसलिए, नोड .js में एक वैश्विक ऑब्जेक्ट [डॉक्स] भी हैJSON

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


किसी को पता है कि आधिकारिक दस्तावेज में क्यों नहीं है? या, अगर यह है, तो इसे कहां ढूंढें?
Snapfractalpop

34
@snapfractalpop: प्रलेखन केवल कार्यों, आदि का वर्णन करता है, जो नोड का हिस्सा हैं। मानक जावास्क्रिप्ट सुविधाएँ V8 का हिस्सा हैं , node.js पर बनाया गया है। मैंने उसी हिसाब से जवाब अपडेट किया।
फेलिक्स क्लिंग

1
@FelixKling इसके लायक होने के लिए, नोड के
गिथब

यहाँ, मैंने एक डेमो प्रकाशित किया है जहाँ आप ऑनलाइन इस उत्तर के साथ देख सकते हैं और खेल सकते हैं (पार्सिंग उदाहरण app.js फ़ाइल में है - फिर रन बटन पर क्लिक करें और टर्मिनल में परिणाम देखें): लिंक आप कोड को संशोधित कर सकते हैं और प्रभाव देखें ...
nathan g

आपके उत्तर के लिए जावास्क्रिप्ट सिंटैक्स के पूर्व ज्ञान की आवश्यकता है। उपयोग उदाहरण दिखाना कितना कठिन होगा? JSON.parse (एसटीआर); // नो-फ्रेंडली है और इसलिए बेहतर उत्तर है
वेब

661

आप .json फ़ाइलों की आवश्यकता कर सकते हैं ।

var parsedJSON = require('./file-name');

उदाहरण के लिए, यदि आपके पास config.jsonउसी निर्देशिका में एक फ़ाइल है, जिसका स्रोत कोड फ़ाइल आप उपयोग करेंगे:

var config = require('./config.json');

या (फ़ाइल एक्सटेंशन को छोड़ा जा सकता है):

var config = require('./config');

ध्यान दें कि requireहै तुल्यकालिक और केवल फ़ाइल पढ़ता है एक बार , निम्नलिखित कॉल कैश से परिणाम वापसी

यह भी नोट करें कि आपको केवल अपने पूर्ण नियंत्रण में स्थानीय फ़ाइलों के लिए इसका उपयोग करना चाहिए, क्योंकि यह फ़ाइल के भीतर किसी भी कोड को संभावित रूप से निष्पादित करता है।


4
यदि आप फ़ाइल को पार्स करने के लिए इस पद्धति का उपयोग कर रहे हैं, तो यह सुनिश्चित करने के लिए पथ को ध्यान में रखना चाहिए। उदाहरण के लिए, आपको ऐसा कुछ करने की आवश्यकता हो सकती है: './file-name-with-no-extension' (उदाहरण के लिए यदि फ़ाइल वर्तमान निर्देशिका में है)
SnapShot

94
ध्यान दें कि प्रतिक्रिया कैश्ड है। उदाहरण के लिए, यदि आप किसी फ़ंक्शन में कॉल करना चाहते हैं, तो फ़ंक्शन को कॉल करें, JSON फ़ाइल को बदलें, और फ़ंक्शन को फिर से कॉल करें, आपको JSON फ़ाइल का पुराना संस्करण मिलेगा । मुझे एक दो बार पकड़ा है!
बेन क्लेटन

15
ध्यान दें कि requireतुल्यकालिक भी है । यदि आप fs.readFileइसके बजाय इस्कॉन फ्रेंडली उपयोग करना चाहते हैंJSON.parse
इवान मोरन

29
क्या यह दृष्टिकोण फ़ाइल को केवल जावास्क्रिप्ट के रूप में मानता है, इस प्रकार संभवतः .json फ़ाइल में मनमाना कोड चल रहा है?
d11wtq

15
सरल नोट: .jsonविस्तार का उपयोग करने के लिए मत भूलना ! यदि आपकी फ़ाइल में .jsonएक्सटेंशन नहीं है , तो आवश्यकता नहीं है कि इसे एक json फ़ाइल माना जाएगा।
जेसन

323

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

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

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


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

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

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

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

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


load-json-file मापांक

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

const loadJsonFile = require('load-json-file');

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

loadJsonFile('/path/to/file.json').then(json => {
    // `json` contains the parsed object
});

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

let obj = loadJsonFile.sync('/path/to/file.json');

धाराओं से JSON को पार्स करना

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

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


त्रुटि से निपटने / सुरक्षा

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


2
and could even lead to security holesजिज्ञासा से बाहर, कैसे?
नटारियो

6
@natario: हम यहां सर्वर-साइड JS के बारे में बात कर रहे हैं। मान लीजिए कि कोई व्यक्ति JSON उपयोगकर्ता-प्रदाय कर रहा है। यदि यह धारणा है कि JSON हमेशा अच्छी तरह से बनता है, तो एक हमलावर एक त्रुटि को ट्रिगर करने के लिए कुछ विकृत JSON भेज सकता है, जो यदि क्लाइंट पक्ष को दिया जाता है, तो सिस्टम के बारे में महत्वपूर्ण जानकारी प्रकट कर सकता है। या यदि JSON दोनों विकृत और कुछ पाठ सम्‍मिलित थे <script>..., और त्रुटि क्लाइंट पक्ष को दी गई है, तो आपके पास XSS बग ठीक है। इसलिए IMO यह JSON त्रुटियों को संभालने के लिए महत्वपूर्ण है जहां आप इसे पार्स करते हैं।
संपतश्री

1
@NickSteele: हालाँकि, मैंने "यह अनुशंसित नहीं है" को "मैं अनुशंसा नहीं करता" को बदल दिया। मुझे उम्मीद है कि अब आप खुश हैं।
संपतश्री

1
@NickSteele: मेरे द्वारा सूचीबद्ध दोषों को देखते हुए मुझे नहीं लगता कि यह एक अच्छी तरह से डिज़ाइन की गई विशेषता है। मुझे कुछ लोगों की तरह लगता है "हे, यह requireJSON को शामिल करने के लिए उपयोग करने के लिए अच्छा नहीं होगा ?" और भी साइड इफेक्ट का दस्तावेजीकरण परेशान नहीं किया। इसका मतलब यह भी था कि दो भाषाओं में फ़ाइलों को स्वीकार करने की आवश्यकता है: जावास्क्रिप्ट, और JSON (नहीं वे समान नहीं हैं)। एसआरपी के लिए इतना ही।
संपतश्री

1
@NickSteele: हां, केवल कॉन्फिग के लिए यह ठीक काम करता है। लेकिन JSON का उपयोग केवल विन्यास के लिए नहीं किया जाता है।
संपतश्री ११'१17

85

JSON ऑब्जेक्ट का उपयोग करें :

JSON.parse(str);

12
यह सिर्फ शीर्ष उत्तर की नकल करता है। कृपया इसे हटाने पर विचार करें; आप अंक रखेंगे।
डैन डस्केल्सस्कु

6
इस उत्तर में 50 उत्थान हैं। 1% नियम के अनुसार , संभवतः 5000 उपयोगकर्ताओं ने इस उत्तर को पढ़ने में समय बिताया है, जो शीर्ष पर कुछ भी नहीं जोड़ता है। तथ्य यह है कि यह 3 साल पुराना है केवल समस्या को बदतर बनाता है :)
डैन डैस्केल्सस्कु

16
@DanDascalescu - यदि आप ध्यान देंगे, तो दो उत्तर ठीक 3 साल पहले उसी समय पोस्ट किए गए थे। वे दोनों एक ही जानकारी प्रदान करते हैं। यह सब SO पर मामला है, मैं अपने उत्तर के आधे भाग को केवल इसलिए नहीं ले जाऊंगा क्योंकि वे स्वीकृत उत्तर नहीं थे।
मार्क कहन

8
मुझे एक के बाद एक टिप्पणियों की यह श्रृंखला काफी दिलचस्प लगी लेकिन इसका जवाब अपने समय की बर्बादी है। ... मुझे यकीन नहीं है कि अगर इसका मतलब है कि उत्तर को हटा दिया जाना चाहिए, क्योंकि तब मैंने टिप्पणी धागा नहीं देखा होगा। लेकिन अन्यथा मैं हाँ कहूँगा।
मैल्कमऑनियन

7
@DanDascalescu, मेरा मानना ​​है कि यह उत्तर स्पष्ट और सीधे बिंदु पर है। स्वीकृत एक उपयोग उदाहरण नहीं देता है और कई लिंक और अतिरिक्त सामान के कारण भ्रमित हो रहा है।
andresgottlieb

37

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

2
मुझे पसंद है कि इस दृष्टिकोण को आवेदन के लिए स्थानीय फ़ाइल होने की आवश्यकता नहीं है। धन्यवाद!
चार्ल्स ब्रांट

35

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

एक नज़र है: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json


1
यह विशेष रूप से सच है यदि कोई आने वाले कनेक्शन से JSON डेटा की अपेक्षा करता है। यदि विकृत JSON JSON.parseआपके संपूर्ण एप्लिकेशन द्वारा पार्स किया जा रहा है, तो क्रैश या उपयोग करने जा रहा है process.on('uncaughtException', function(err) { ... });, तो अंततः उपयोगकर्ता को "विकृत JSON" त्रुटि भेजने का कोई मौका नहीं मिलेगा।
पॉल

3
कौन सा asyncपार्सर है? मुझे यह नहीं मिला।
bxshi

3
लिंक किए गए पृष्ठ को अब "DEPRECated" के रूप में चिह्नित किया गया है और खुद को "फीका अवशेष" के रूप में वर्णित करता है।
कोई नहीं

30

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

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

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


2
यह ध्यान देने योग्य हो सकता है कि आपको अपनी var फ़ाइल लाइन को एक कोशिश / कैच में लपेटना चाहिए, यदि आपका JSON पार्स करने में विफल रहता है या फ़ाइल मौजूद नहीं है।
फोस्टा

3
या सिर्फ एक कॉलबैक का उपयोग करें!
लक्स

10

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

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

2
मैं सिर्फ एक नोट बनाना चाहता हूं कि process.nextTick aysnc नहीं है। यह जेएस ईवेंट लूप में अगले फ़ंक्शन कॉल तक फ़ाइल को पढ़ना बंद कर रहा है। JSON.parse को अतुल्यकालिक रूप से चलाने के लिए आपने मुख्य Node.js धागे की तुलना में एक अलग धागे का उपयोग किया है
अलेक्जेंडर मिल्स


7

यहाँ हर किसी ने JSON.parse के बारे में बताया है, इसलिए मैंने कुछ और कहने की सोची। ऐप्स के विकास को आसान और बेहतर बनाने के लिए कई मिडलवेयर के साथ एक बढ़िया मॉड्यूल कनेक्ट है। मिडलवेयर में से एक बॉडीपेयर है । यह JSON, html- form और इत्यादि को पार्स करता है । JSON के लिए एक विशिष्ट मिडलवेयर भी है जो केवल noop है

उपरोक्त लिंक पर एक नज़र डालें, यह वास्तव में आपके लिए उपयोगी हो सकता है।



6

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

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

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

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

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

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

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


5

NSON.js के साथ अपने कॉन्फ़िगरेशन के लिए JSON का उपयोग करना? इसे पढ़ें और 9000 से अधिक पर अपना कॉन्फ़िगरेशन कौशल प्राप्त करें ...

नोट: उस डेटा का दावा करने वाले लोग = ('./ data.json') की आवश्यकता है; एक सुरक्षा जोखिम है और जोशीले उत्साह के साथ लोगों के उत्तरों को नीचा दिखाना: आप बिल्कुल सही और पूरी तरह से गलत हैं । गैर-JSON को उस फ़ाइल में रखने का प्रयास करें ... नोड आपको एक त्रुटि देगा, ठीक उसी तरह जैसे अगर आपने एक ही चीज़ को बहुत धीमी और कठिन कोड मैनुअल फ़ाइल को पढ़ा और फिर बाद में JSON.parse () के साथ किया। कृपया गलत सूचना फैलाना बंद करें; आप दुनिया को नुकसान पहुंचा रहे हैं, मदद नहीं कर रहे हैं। नोड को यह अनुमति देने के लिए डिज़ाइन किया गया था ; यह एक सुरक्षा जोखिम नहीं है!

उचित अनुप्रयोग विन्यास की 3 + परतों में आते हैं :

  1. सर्वर / कंटेनर कॉन्फ़िगरेशन
  2. एप्लिकेशन कॉन्फ़िगरेशन
  3. (वैकल्पिक) किरायेदार / समुदाय / संगठन कॉन्फिग
  4. उपयोगकर्ता का विन्यास

अधिकांश डेवलपर्स अपने सर्वर और ऐप कॉन्फिग्रेशन का इलाज करते हैं जैसे कि यह बदल सकता है। यह नहीं कर सकता। आप एक-दूसरे के ऊपर ऊंची परतों से परिवर्तन कर सकते हैं , लेकिन आप आधार आवश्यकताओं को संशोधित कर रहे हैं । कुछ चीजों का अस्तित्व होना आवश्यक है! अपने कॉन्फिग एक्ट को ऐसे बनाएं जैसे यह अपरिवर्तनीय है, क्योंकि इसमें से कुछ मूल रूप से आपके सोर्स कोड की तरह है।

स्टार्टअप के बाद आपके बहुत सारे सामानों को बदलने में असफल होने से रोकने के लिए आपके पैटर्न को लोड / पकड़ने वाले ब्लॉक के साथ लोड करने जैसे एंटी-पैटर्न की ओर जाता है, और दिखावा आप बिना जारी रख सकते हैं अपने ठीक से सेटअप एप्लिकेशन के । आप नहीं कर सकते। यदि आप ऐसा कर सकते हैं, जो समुदाय / उपयोगकर्ता कॉन्‍फ़िगरेशन लेयर में है, न कि सर्वर / ऐप कॉन्‍फ़िगरेशन लेयर में। आप सिर्फ गलत कर रहे हैं। वैकल्पिक सामग्री शीर्ष पर स्तरित होनी चाहिए, जब एप्लिकेशन का बूटस्ट्रैप खत्म हो जाए।

दीवार के खिलाफ अपना सिर पीटना बंद करें: आपका कॉन्फ़िगरेशन अल्ट्रा सरल होना चाहिए ।

इस बात पर एक नज़र डालें कि एक प्रोटोकॉल-एग्नॉस्टिक और डेटासोर्स-एग्नोस्टिक सर्विस फ्रेमवर्क के रूप में कॉम्प्लेक्स के रूप में किसी चीज़ को सेटअप करना कितना आसान है, एक साधारण जोंस कॉन्फिग फाइल और सिंपल app.js फ़ाइल का उपयोग करना ...

कंटेनर-config.js ...

{
    "service": {
        "type"  : "http",
        "name"  : "login",
        "port"  : 8085
    },
    "data": {
        "type"  : "mysql",
        "host"  : "localhost",
        "user"  : "notRoot",
        "pass"  : "oober1337",
        "name"  : "connect"
    }
}

index.js ... (इंजन जो हर चीज को शक्ति देता है)

var config      = require('./container-config.json');       // Get our service configuration.
var data        = require(config.data.type);            // Load our data source plugin ('npm install mysql' for mysql).
var service     = require(config.service.type);         // Load our service plugin ('http' is built-in to node).
var processor   = require('./app.js');                  // Load our processor (the code you write).

var connection  = data.createConnection({ host: config.data.host, user: config.data.user, password: config.data.pass, database: config.data.name });
var server      = service.createServer(processor);
connection.connect();
server.listen(config.service.port, function() { console.log("%s service listening on port %s", config.service.type, config.service.port); });

app.js ... (कोड जो आपके प्रोटोकॉल-अज्ञेय और डेटा-स्रोत अज्ञेय सेवा को शक्ति देता है)

module.exports = function(request, response){
    response.end('Responding to: ' + request.url);
}

इस पैटर्न का उपयोग करके, अब आप अपने बूट किए गए ऐप के शीर्ष पर समुदाय और उपयोगकर्ता कॉन्फ़िगरेशन सामान लोड कर सकते हैं, देव ऑप्स आपके काम को एक कंटेनर में बंद करने और इसे स्केल करने के लिए तैयार है। आप मल्टीटेनेंट के लिए पढ़े हैं। उपयोगकर्ताभूमि पृथक है। अब आप इस बात से अलग हो सकते हैं कि आप किस सेवा प्रोटोकॉल का उपयोग कर रहे हैं, आप किस डेटाबेस प्रकार का उपयोग कर रहे हैं, और केवल अच्छे कोड लिखने पर ध्यान केंद्रित करें।

क्योंकि आप परतों का उपयोग कर रहे हैं, तो आप सब कुछ के लिए सच का एक ही स्रोत पर, किसी भी समय (स्तरित config वस्तु) पर हर कदम पर से बचने त्रुटि जाँच भरोसा कर सकते हैं, और, के बारे में "ओह बकवास, मैं कैसे बनाने के लिए जा रहा हूँ चिंता इस उचित विन्यास के बिना काम?? "।


4

मेरा समाधान:

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

धन्यवाद @eloyesp, मैंने इस कोड का उपयोग करने की कोशिश की, लेकिन मुझे TypeError: path must be a string or Bufferत्रुटियाँ मिलती रहती हैं - कोई भी विचार जहां इस मुद्दे को डीबग करना शुरू करना है?
जीपीपी

4

बस जवाब को पूरा करना चाहते हैं (जैसा कि मैंने इसके साथ थोड़ी देर के लिए संघर्ष किया), यह दिखाना चाहते हैं कि कैसे जौन जानकारी का उपयोग किया जाए, यह उदाहरण जौन ऐरे को एक्सेस करने से पता चलता है:

var request = require('request');
request('https://server/run?oper=get_groups_joined_by_user_id&user_id=5111298845048832', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var jsonArr = JSON.parse(body);
    console.log(jsonArr);
    console.log("group id:" + jsonArr[0].id);
  }
})


3

बस इसे यथासंभव जटिल बनाने के लिए, और यथासंभव अधिक से अधिक पैकेज लाएं ...

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 / प्रतीक्षा का उपयोग कर रहे हैं:

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

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


2

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

Json-safe-parse npm पेज से:

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


2

उत्तोलन लोदाश का एक त्रुटि ऑब्जेक्ट वापस करने का प्रयास करता है, जिसे आप 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

3
क्या आप बता सकते हैं कि आपने .bindकेवल _.attempt (JSON.parse, str) का उपयोग करने के बजाय क्यों जोड़ा
steviejay

2

हमेशा कोशिश करें कि JSON.parse को कैच ब्लॉक में नोड के रूप में उपयोग किया जाए क्योंकि नोड में हमेशा एक अनपेक्षित त्रुटि होती है यदि आपके पास अपने जोंस में कुछ दूषित डेटा है तो साधारण JSON.Parse के बजाय इस कोड का उपयोग करें

try{
     JSON.parse(data)
}
catch(e){
   throw new Error("data is corrupted")
  }

1

यदि आप अपने JSON में कुछ टिप्पणियां जोड़ना चाहते हैं और अनुगमन के अल्पविरामों को लागू करना चाहते हैं, तो आप नीचे दिए गए कार्यान्वयन का उपयोग कर सकते हैं:

var fs = require('fs');

var data = parseJsData('./message.json');

console.log('[INFO] data:', data);

function parseJsData(filename) {
    var json = fs.readFileSync(filename, 'utf8')
        .replace(/\s*\/\/.+/g, '')
        .replace(/,(\s*\})/g, '}')
    ;
    return JSON.parse(json);
}

ध्यान दें कि यदि "abc": "foo // bar"आपके JSON में कुछ ऐसा है तो यह अच्छी तरह से काम नहीं कर सकता है । तो YMMV।


1

यदि JSON स्रोत फ़ाइल बहुत बड़ी है, तो मूल async के माध्यम से अतुल्यकालिक मार्ग पर विचार करना चाह सकते हैं। Node.js 8.0 के साथ इस प्रकार है।

const fs = require('fs')

const fsReadFile = (fileName) => {
    fileName = `${__dirname}/${fileName}`
    return new Promise((resolve, reject) => {
        fs.readFile(fileName, 'utf8', (error, data) => {
            if (!error && data) {
                resolve(data)
            } else {
                reject(error);
            }
        });
    })
}

async function parseJSON(fileName) {
    try {
        return JSON.parse(await fsReadFile(fileName));
    } catch (err) {
        return { Error: `Something has gone wrong: ${err}` };
    }
}

parseJSON('veryBigFile.json')
    .then(res => console.log(res))
    .catch(err => console.log(err))

1

मैं fs-extra का उपयोग करता हूं । मुझे यह बहुत पसंद है क्योंकि, हालांकि यह कॉलबैक का समर्थन करता है- यह वादे का भी समर्थन करता है । तो यह मुझे बहुत अधिक पठनीय तरीके से अपना कोड लिखने में सक्षम बनाता है:

const fs = require('fs-extra');
fs.readJson("path/to/foo.json").then(obj => {
    //Do dome stuff with obj
})
.catch(err => {
    console.error(err);
});

इसमें कई उपयोगी विधियां भी हैं जो मानक fsमॉड्यूल के साथ नहीं आते हैं और , इसके शीर्ष पर, यह मूल fsमॉड्यूल से विधियों को भी पुल करता है और उन्हें प्रॉमिस करता है।

नोट: आप अभी भी देशी Node.js विधियों का उपयोग कर सकते हैं। उन्हें प्रॉमिस किया जाता है और fs-extra पर कॉपी किया जाता है। नोट देखें fs.read()&fs.write()

तो यह मूल रूप से सभी फायदे हैं। मुझे आशा है कि दूसरों को यह उपयोगी लगेगा।


1

यदि आपको JSON को Node.js के साथ सुरक्षित तरीके से पार्स करने की आवश्यकता है (aka: उपयोगकर्ता इनपुट डेटा, या एक सार्वजनिक एपीआई) मैं सुरक्षित json-parse का उपयोग करने का सुझाव दूंगा

उपयोग डिफ़ॉल्ट की तरह है JSON.parseलेकिन यह आपके कोड की रक्षा करेगा:

const badJson = '{ "a": 5, "b": 6, "__proto__": { "x": 7 }, "constructor": {"prototype": {"bar": "baz"} } }'

const infected = JSON.parse(badJson)
console.log(infected.x) // print undefined

const x = Object.assign({}, infected)
console.log(x.x) // print 7

const sjson = require('secure-json-parse')
console.log(sjson.parse(badJson)) // it will throw by default, you can ignore malicious data also

0

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

या कुछ JSON पार्सिंग npm लाइब्रेरी का उपयोग करें, कुछ json-parse-or की तरह



0

NodeJs एक जावास्क्रिप्ट आधारित सर्वर है, इसलिए आप शुद्ध जावास्क्रिप्ट में जिस तरह से कर सकते हैं ...

कल्पना कीजिए कि आप इस राशि Json में NodeJS ...

var details = '{ "name": "Alireza Dezfoolian", "netWorth": "$0" }';
var obj = JSON.parse(details);

और आप अपने json के एक पार्स संस्करण प्राप्त करने के लिए ऊपर कर सकते हैं ...


0

जैसा कि ऊपर दिए गए उत्तरों में बताया गया है, हम उपयोग कर सकते हैं JSON.parse() JSON के तार को पार्स करने के लिए लेकिन पार्स करने से पहले, सही डेटा को पार्स करना सुनिश्चित करें अन्यथा यह आपके पूरे आवेदन को नीचे ला सकता है।

इसे इस तरह इस्तेमाल करना सुरक्षित है

let parsedObj = {}
try {
    parsedObj = JSON.parse(data);
} catch(e) {
    console.log("Cannot parse because data is not is proper json format")
}

0

का उपयोग करें JSON.parse(str);। इसके बारे में यहाँ और पढ़ें ।

यहाँ कुछ उदाहरण हैं:

var jsonStr = '{"result":true, "count":42}';

obj = JSON.parse(jsonStr);

console.log(obj.count);    // expected output: 42
console.log(obj.result);   // expected output: true

-1

कोई और मॉड्यूल की आवश्यकता नहीं है।
बस
var parsedObj = JSON.parse(yourObj);
मुझे लगता है कि इस बारे में कोई सुरक्षा समस्या है डॉन का उपयोग करें


-2

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


2
क्या आपने इस प्रश्न के शीर्ष उत्तर को देखा है? यह 3 साल का है और बहुत पूरा है। आप यहां दी जा रही तुच्छ जानकारी के साथ क्या योगदान देने की उम्मीद कर रहे थे?
रॉबी कॉर्नेलिसन

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