json - C#এ একটি জson ফাইল পড়ুন এবং বিশ্লেষণ করুন



parsing large-files (5)

আমি কোড নমুনা এবং ইত্যাদি সহ প্রায় দুই দিন "ফাফিং" এর সেরা অংশটি কাটিয়েছি, c # এ একটি অ্যারেতে একটি বড় JSON ফাইল পড়ার চেষ্টা করছি, তাই আমি পরে এটি প্রসেসের জন্য একটি 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" প্রয়োজন, কিন্তু আমি "vcc" মুদ্রণ করতে চাই না।

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


Answers

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

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

আমার উল্লেখ করা উচিত যে HTTP কলের সামগ্রীর জন্য এটি দ্রুত এবং কার্যকর, যেখানে টাইপটি প্রয়োজন হয় না। এবং Anonymous পরিবর্তে Object ব্যবহার করে আপনি আপনার ভিজ্যুয়াল স্টুডিও পরিবেশে Option Strict On বজায় রাখতে পারেন - আমি এটি বন্ধ করতে ঘৃণা করি।


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

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


সঠিক পথ খোঁজার জন্য আমি ব্যবহার করছি

   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://.com/a/32071002/4420355 দেখুন


কিভাবে সব জিনিস সহজ তৈরীর?

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

আপনি Item ক্লাস ঘোষণা না করেও dynamic সহযোগী মানগুলি পেতে পারেন।

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

$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

দ্রষ্টব্য: এটি করার উপায় নেই।

পার্ল একই:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

নোট 2: আপনি চালানো হলে

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

চমত্কারভাবে পঠনযোগ্য শব্দ এনকোড হয়ে যায়

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

আপনার পাইপলাইনের বাকিটি যদি ensure_ascii=False চিত্তাকর্ষকভাবে হ্যান্ডেল করে এবং আপনি আপনার JSON কেও মানব-বান্ধব হতে চান তবে কেবল নিশ্চিত করুন নিশ্চিত ensure_ascii=False

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

এবং আপনি পাবেন:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}




c# json parsing large-files