সি # তে একটি জসন ফাইল পড়ুন এবং পার্স করুন


239

কোড স্যাম্পল ইত্যাদি নিয়ে আমি দু'দিনের "ফ্যাফিং" এর বেশিরভাগ অংশটি ব্যয় করেছি, খুব বড় জেএসওএন ফাইলকে সি # তে অ্যারেতে পড়ার চেষ্টা করছি যাতে আমি পরে এটিকে প্রসেসিংয়ের জন্য 2 ডি অ্যারে বিভক্ত করতে পারি।

আমার যে সমস্যাটি ছিল তা আমি লোকেরা যা করার চেষ্টা করছিলাম তার কোনও উদাহরণ খুঁজে পেলাম না। এর অর্থ আমি কেবল কোডটি সম্পাদনা করছিলাম সেরাটির জন্য আশা করি।

আমি এমন কিছু কাজ করতে সক্ষম হয়েছি যা করতে পারে:

  • শিরোনাম মিস করা ফাইলটি পড়ুন এবং কেবল অ্যারেতে মানগুলি পড়ুন।
  • একটি অ্যারের প্রতিটি লাইনে একটি নির্দিষ্ট পরিমাণের মান রাখুন। (সুতরাং আমি পরে এটি একটি 2 ডি অ্যারে বিভক্ত করতে পারি)

এটি নীচের কোড দিয়ে করা হয়েছিল তবে এটি অ্যারেতে কয়েক লাইন প্রবেশের পরে প্রোগ্রামটি ক্র্যাশ করে। এটি ফাইলের আকারের সাথে থাকতে পারে।

// 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" দরকার, তবে আমি এটি "ভিসিসি" মুদ্রণ করতে চাই না।

আমি আশা করছি যে কেউ আমাকে কীভাবে JSON ফাইলটি পড়তে পারেন এবং কেবলমাত্র আমার প্রয়োজনীয় ডেটা বের করতে এবং এটি একটি অ্যারে বা এমন কিছুতে রেখে দিতে পারেন যা আমি পরে অ্যারে রাখতে ব্যবহার করতে পারি।


1
আপনার প্রোগ্রামটি ক্রাশ হওয়ার পরে কোন ব্যতিক্রম ছুঁড়ে ফেলবে?
tmesser

উত্তর:


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
সি # ডটনেট কোরটিতে, ব্যবহার করুন: (স্ট্রিমরিডার r = ফাইল.অপেনটেক্সট ("file.json")) ব্যবহার করুন
ফ্রেড

20
ভাবেন যারা অন্য উত্তর পড়া এই এক বুঝতে পছন্দ করি না জন্য: এই সমাধান Json.net প্যাকেজ (Newtonsoft.Json) প্রয়োজন
Tydaeus

1
যেহেতু আপনি একটি আছে StreamReaderযাহাই হউক না কেন, এটা ভাল হবে ব্যবহার স্ট্রীম থেকে সরাসরি deserialize করতে JsonTextReaderযেমন দেখানো একটি স্ট্রিম থেকে ক্যান Json.NET ধারাবাহিকভাবে / deserialize করতে /? । এর r.ReadToEnd()দরকার নেই।
ডিবিসি

43

এটি নিজেই করা একটি ভয়াবহ ধারণা। Json.NET ব্যবহার করুন । এটি ইতিমধ্যে বেশিরভাগ প্রোগ্রামারদের যদি কাজটি শেষ করতে কয়েক মাস দেওয়া হয় তবে তার চেয়ে বেশি সমস্যার সমাধান হয়েছে। আপনার নির্দিষ্ট চাহিদা হিসাবে, অ্যারে মধ্যে পার্স এবং এই ধরনের, চেক ডকুমেন্টেশন , বিশেষ করে উপর JsonTextReader। মূলত, জসন.এনইটি জেএসওন অ্যারেগুলি স্থানীয়ভাবে পরিচালনা করে এবং সেগুলি স্ট্রিংস, ইনটস বা যা কিছু প্রকার হয় তা আপনার কাছ থেকে প্রেরিত না করে পার্সে ভাগ করে দেবে। এখানে পাঠক এবং লেখক উভয়ের জন্যই মূল কোডের ব্যবহারের সরাসরি লিঙ্ক রয়েছে, যাতে আপনি এটির সাথে কাজ করতে শিখতে গিয়ে একটি অতিরিক্ত উইন্ডোতে খোলা রাখতে পারেন।

এটি সর্বোত্তমর জন্য: এই সময় অলস থাকুন এবং একটি লাইব্রেরি ব্যবহার করুন যাতে আপনি এই সাধারণ সমস্যাটিকে চিরতরে সমাধান করেন


1
আমি Json.net ব্যবহার করছি তবে এটি কীভাবে সঠিকভাবে কাজ করে তা আমি বুঝতে পারি না। আমি যখন পাঠ্যবক্সে জসনটেক্সটআরডার ব্যবহার করে তথ্যটি পড়ি তখন আমি প্রতি বিট ডেটা পেতে পারি তবে শিরোলেখ ইত্যাদি just আমি কেবল শিরোনামে ভলস চাই। আমি জসন.এনইটি ডকুমেন্টেশন পড়ার চেষ্টা করেছি কিন্তু এটি আমার পছন্দ মতোভাবে এটি ব্যবহার করার মতো যথেষ্ট পরিমাণের আমার কাছে ব্যাখ্যা করার মতো এটি খুঁজে পেল না
ক্রিস ডিভাইন

@ ক্রিসডেভাইন "জসন শিরোনাম"? আপনি কীগুলি উল্লেখ করছেন? আপনি যদি JSON এর একটি সংক্ষিপ্ত (lines 10-15 লাইন) স্নিপেট পোস্ট করেন এবং আপনি কী সরানোর চেষ্টা করছেন সেগুলি নির্দিষ্ট করে জানাতে সম্ভবত এটি আরও সহজ হবে।
tmesser

@ ক্রিসডেভাইন আমি এই মুহূর্তে আপনার প্রশ্নের উত্তরটি আপনার প্রশ্নের সাথে যুক্ত করেছি, আপনি যদি দয়া করে দয়া করে এই প্রশ্নের উপরের মন্তব্যটি মুছতে পারেন তবে দুর্দান্ত হতে পারে d
tmesser

@ ক্রিসডেভাইন এছাড়াও, আপনার প্রশ্নের বিষয়ে আমার মন্তব্য সম্পর্কে যদি আপনি উত্তর দিতে পারেন তবে তাও দুর্দান্ত।
tmesser

1
@ ক্রিসডেভাইন হ্যাঁ, আমি বলছি যে আমি এটি আপনার প্রশ্নে রেখেছি সুতরাং এটি আর দরকার নেই।
tmesser

12

@ এলবির সমাধানের ভিত্তিতে, ভিবি কোডটি ( Objectপরিবর্তে টাইপ করা Anonymous) হয়

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

আমার উল্লেখ করা উচিত যে এইচটিটিপি কল সামগ্রী তৈরি করতে যেখানে এই ধরণের প্রয়োজন হয় না তা দ্রুত এবং দরকারী। এবং এর 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 

পাথ.কোমাইন পথটি ব্যবহার করে athপথসেপেটর এবং এটি প্রথম পাথের শেষে ইতিমধ্যে পৃথককারী আছে কিনা তা এটি পরীক্ষা করে যাতে এটি পৃথককারীদের সদৃশ করে না। অতিরিক্তভাবে, এটি পরীক্ষা করে যে পাথ উপাদানগুলিকে একত্রিত করার জন্য অবৈধ অক্ষর রয়েছে কিনা তা পরীক্ষা করে।

Https://stackoverflow.com/a/32071002/4420355 দেখুন


2
: ভাল উপায় আবেদন নির্বিশেষে সুনির্দিষ্ট পাথ এটি stackoverflow.com/questions/15653921/get-current-folder-path/...
user3326078

3

কোনও জেএসএন পার্সের জন্য, আপনার জেএসওএনকে সি # অবজেক্টে ডিসিরিয়ালাইজ করতে আপনার # JSON কে সি # শ্রেণিতে রূপান্তর করতে http://json2csharp.com/ (সবচেয়ে সহজ উপায়) ওয়েবসাইটটি ব্যবহার করুন ।

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

তারপরে জাভাস্ক্রিপ্টসরিয়ালাইজারটি ব্যবহার করুন (System.Web.Script.Serialization থেকে), যদি আপনি নিউটনসফ্টের মতো কোনও তৃতীয় পক্ষের ডিএলএল না চান।

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

তারপরে আপনি আইটেম.নাম বা আইটেমস.উরল ইত্যাদির সাহায্যে আপনার বস্তুটি পেতে পারেন


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.