C # में एक Json फ़ाइल पढ़ें और पार्स करें


239

मैंने कोड नमूने और आदि के बारे में दो दिनों के "फाफिंग" का सबसे अच्छा हिस्सा बिताया है, एक बहुत बड़ी JSON फ़ाइल को c # में एक सरणी में पढ़ने की कोशिश कर रहा हूं, इसलिए मैं बाद में इसे प्रसंस्करण के लिए 2d सरणी में विभाजित कर सकता हूं।

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

मैंने कुछ काम करने में कामयाबी हासिल की है:

  • फ़ाइल को हेडर से मिस करें और केवल सरणी में मान पढ़ें।
  • किसी सरणी की प्रत्येक पंक्ति पर मानों की एक निश्चित मात्रा रखें। (इसलिए मैं बाद में इसे 2d सरणी में डाल सकता हूं)

यह नीचे दिए गए कोड के साथ किया गया था, लेकिन यह कुछ लाइनों को सरणी में दर्ज करने के बाद प्रोग्राम को क्रैश कर देता है। यह फ़ाइल आकार के साथ करना पड़ सकता है।

// If the file extension was a jave file the following 
// load method will be use else it will move on to the 
// next else if statement
if (fileExtension == ".json") 
{
    int count = 0;
    int count2 = 0;
    int inOrOut = 0;
    int nRecords=1; 
    JsonTextReader reader = new JsonTextReader(new StreamReader(txtLoaction.Text));
    string[] rawData = new string[5];
    while (reader.Read())
    {
        if (reader.Value != null)
            if (inOrOut == 1)
            {
                if (count == 6)
                {
                    nRecords++;
                    Array.Resize(ref rawData, nRecords);
                    //textBox1.Text += "\r\n";
                    count = 0;
                }
                rawData[count2] += reader.Value + ","; //+"\r\n"
                inOrOut = 0;
                count++;
                if (count2 == 500)
                {
                    MessageBox.Show(rawData[499]);
                }
            }
            else
            {
                inOrOut = 1;
            }
    } 
}

मैं जिस JSON के साथ काम कर रहा हूं उसका एक स्निपेट है:

[ 
    { "millis": "1000", 
      "stamp": "1273010254", 
      "datetime": "2010/5/4 21:57:34", 
      "light": "333", 
      "temp": "78.32", 
      "vcc": "3.54" }, 
] 

मुझे इस JSON से मानों की आवश्यकता है। उदाहरण के लिए, मुझे "3.54" चाहिए, लेकिन मैं नहीं चाहूंगा कि यह "vcc" प्रिंट करे।

मुझे उम्मीद है कि कोई मुझे JSON फ़ाइल पढ़ने के लिए दिखा सकता है और केवल उस डेटा को निकाल सकता है जिसकी मुझे ज़रूरत है और इसे किसी सरणी या किसी ऐसी चीज़ में डाल दें जिसका उपयोग मैं बाद में किसी सरणी में करने के लिए कर सकता हूं।


1
क्रैश होने पर आपका प्रोग्राम क्या अपवाद छोड़ता है?
21

1
क्या इससे आपके सवाल का जवाब मिलता है? मैं JSON को C # के साथ कैसे पार्स कर सकता हूं?
विधर्मी बंदर

जवाबों:


483

Json.NET के साथ सभी चीजों को आसान बनाने के बारे में कैसे ?

public void LoadJson()
{
    using (StreamReader r = new StreamReader("file.json"))
    {
        string json = r.ReadToEnd();
        List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);
    }
}

public class Item
{
    public int millis;
    public string stamp;
    public DateTime datetime;
    public string light;
    public float temp;
    public float vcc;
}

आप कक्षा dynamicको घोषित किए बिना भी सहयोगी मान सकते हैं Item

dynamic array = JsonConvert.DeserializeObject(json);
foreach(var item in array)
{
    Console.WriteLine("{0} {1}", item.temp, item.vcc);
}

1
@ChrisDevine मुझे आशा है कि आपने पथ नहीं डाला है json। यह आपकी फ़ाइल की सामग्री होनी चाहिए।
एलबी

4
StreamReader ("file.json") को स्ट्रीम की आवश्यकता नहीं है स्ट्रिंग
vg

13
C # डॉटनेट कोर में, उपयोग करें: (StreamReader r = File.OpenText ("file.json") का उपयोग करके
फ्रेड

20
उन लोगों के लिए जो इसे समझने के लिए अन्य उत्तरों को पढ़ना पसंद नहीं करते हैं: इस समाधान के लिए Json.net पैकेज (Newtonsoft.Json) की आवश्यकता है
Tydaeus

1
चूँकि आपके पास StreamReaderवैसे भी है, इसलिए बेहतर होगा कि जिस धारा Json.NETJsonTextReader में दिखाया गया है, उस धारा से सीधे डिसिएरलाइज़ करें? । की r.ReadToEnd()जरूरत नहीं है।
dbc

43

ऐसा करना अपने आप में एक भयानक विचार है। Json.NET का उपयोग करें । यह पहले से ही समस्या को हल कर दिया है सबसे प्रोग्रामर से बेहतर हो सकता है अगर वे इस पर काम करने के लिए महीने के अंत में दिया गया था। अपनी विशिष्ट आवश्यकताओं के लिए, सरणियों में पार्सिंग और , विशेष रूप से, प्रलेखन की जाँच करें JsonTextReader। मूल रूप से, Json.NET, JSON सरणियों को मूल रूप से संभालता है और उन्हें तार, ints, या जो भी प्रकार होता है, उसे आपसे संकेत दिए बिना पार्स कर देगा। यहाँ पाठक और लेखक दोनों के लिए मूल कोड usages के लिए एक सीधा लिंक है, तो आप इस के साथ काम करने के लिए सीख रहे हैं, जबकि आप एक अतिरिक्त विंडो में खोल सकते हैं।

यह सर्वश्रेष्ठ के लिए है: इस समय आलसी रहें और एक पुस्तकालय का उपयोग करें ताकि आप इस सामान्य समस्या को हमेशा के लिए हल कर सकें


1
मैं Json.net का उपयोग कर रहा हूं, लेकिन मुझे समझ नहीं आ रहा है कि यह कैसे सही ढंग से काम करता है। जब मैं एक टेक्स्टबॉक्स में JsonTextReader का उपयोग करके जानकारी पढ़ता हूं तो मुझे हर बिट डेटा मिलता है, लेकिन हेडर आदि भी होते हैं। मैं सिर्फ हेडर में वाल्यूल्स चाहता हूं। मैंने Json.NET दस्तावेज़ीकरण को पढ़ने की कोशिश की है, लेकिन मुझे यह पसंद नहीं आया कि मेरे लिए इसे इस्तेमाल करने के तरीके में सब कुछ पर्याप्त हो
क्रिस डिवाइन

@ क्रिसडविन "जोंस हेडर"? क्या आप चाबियों का जिक्र कर रहे हैं? शायद यह आसान होगा यदि आपने JSON की एक छोटी (~ 10-15 लाइनें) स्निपेट पोस्ट किया है और ठीक उसी तरह इंगित करें जो आप निकालने की कोशिश कर रहे हैं।
tmesser 21

@ क्रिसहाइडाइन मैंने आपके प्रश्न के लिए यहाँ सिर्फ अपनी टिप्पणी जोड़ी है, इसलिए यदि आप कृपया इस टिप्पणी के ऊपर टिप्पणी हटा सकते हैं तो यह बहुत अच्छा होगा।
tmesser

@ChrisDevine इसके अलावा, अगर आप मेरे उस प्रश्न पर टिप्पणी का उत्तर दे सकते हैं जो भी भयानक होगा।
21

1
@ChrisDevine हाँ, मैं कह रहा हूँ कि मैंने इसे आपके प्रश्न में डाल दिया है इसलिए यह अब यहाँ आवश्यक नहीं है।
tmesser

12

@ LB के समाधान के आधार पर, ( VB कोड के Objectबजाय टाइप किया गया Anonymous) है

Dim oJson As Object = JsonConvert.DeserializeObject(File.ReadAllText(MyFilePath))

मुझे यह उल्लेख करना चाहिए कि यह HTTP कॉल सामग्री के निर्माण के लिए त्वरित और उपयोगी है जहां प्रकार की आवश्यकता नहीं है। और Objectइसके बजाय का उपयोग करके Anonymousआप Option Strict Onअपने विजुअल स्टूडियो वातावरण में बनाए रख सकते हैं - मुझे लगता है कि बंद करने से नफरत है।


7
string jsonFilePath = @"C:\MyFolder\myFile.json";

        string json = File.ReadAllText(jsonFilePath);
        Dictionary<string, object> json_Dictionary = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(json);

        foreach (var item in json_Dictionary)
        {
            // parse here
        }

3

सही रास्ता खोजने के लिए मैं उपयोग कर रहा हूं

   var pathToJson = Path.Combine("my","path","config","default.Business.Area.json");
   var r = new StreamReader(pathToJson);
   var myJson = r.ReadToEnd();

   // my/path/config/default.Business.Area.json 
   [...] do parsing here 

Path.Combine Path.PathSeparator का उपयोग करता है और यह जाँचता है कि क्या पहले पथ में पहले से ही एक विभाजक है, इसलिए यह विभाजकों की नकल नहीं करेगा। इसके अतिरिक्त, यह जाँचता है कि गठबंधन करने के लिए पथ तत्वों में अमान्य वर्ण हैं या नहीं।

Https://stackoverflow.com/a/32071002/4420355 देखें


2
आवेदन की परवाह किए बिना निरपेक्ष पथ खोजने का बेहतर तरीका: stackoverflow.com/questions/15653921/get-current-folder-path/…
user3326078

3

किसी भी JSON पार्स के लिए, http://json2csharp.com/ (सबसे आसान तरीका) वेबसाइट का उपयोग करके अपने JSON को C # ऑब्जेक्ट में शामिल करने के लिए अपने JSON को C # वर्ग में परिवर्तित करें।

 public class JSONClass
 {
        public string name { get; set; }
        public string url { get; set; }
        public bool visibility { get; set; }
        public string idField { get; set; }
        public bool defaultEvents { get; set; }
        public string type { get; set; }        
 }

उसके बाद JavaScriptSerializer (System.Web.Script.Serialization से) का उपयोग करें, यदि आप किसी भी तृतीय पक्ष DLL को newtonsoft नहीं चाहते हैं।

using (StreamReader r = new StreamReader("jsonfile.json"))
{
   string json = r.ReadToEnd();
   JavaScriptSerializer jss = new JavaScriptSerializer();
   var Items = jss.Deserialize<JSONClass>(json);
}

तब आप अपनी वस्तु को Item.name या Item.Url आदि से प्राप्त कर सकते हैं।


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