Baca dan parsing File Json di C #

240

Saya telah menghabiskan bagian terbaik dari dua hari "faffing" tentang dengan contoh kode dan lain-lain, mencoba membaca file JSON yang sangat besar ke dalam array di c # jadi saya nanti dapat membaginya menjadi array 2d untuk diproses.

Masalah yang saya alami adalah saya tidak dapat menemukan contoh orang melakukan apa yang saya coba lakukan. Ini berarti saya hanya mengedit kode sedikit berharap untuk yang terbaik.

Saya telah berhasil membuat sesuatu berfungsi yang akan:

  • Baca file Miss out header dan hanya baca nilai ke dalam array.
  • Tempatkan sejumlah nilai pada setiap baris array. (Jadi saya kemudian bisa membaginya menjadi 2d array)

Ini dilakukan dengan kode di bawah ini tetapi crash program setelah memasukkan beberapa baris ke dalam array. Ini mungkin ada hubungannya dengan ukuran file.

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

Cuplikan dari JSON yang saya kerjakan adalah:

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

Saya perlu nilai dari JSON ini. Sebagai contoh, saya perlu "3.54", tetapi saya tidak ingin mencetak "vcc".

Saya berharap seseorang dapat menunjukkan kepada saya cara membaca file JSON dan hanya mengekstrak data yang saya butuhkan dan memasukkannya ke dalam array atau sesuatu yang bisa saya gunakan untuk kemudian dimasukkan ke dalam array.

Chris Devine
sumber
1
Pengecualian apa yang dilemparkan program Anda saat crash?
tmesser
1
Apakah ini menjawab pertanyaan Anda? Bagaimana saya bisa mengurai JSON dengan C #?
Monyet sesat

Jawaban:

484

Bagaimana dengan mempermudah semuanya dengan 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;
}

Anda bahkan bisa mendapatkan nilai-nilai dynamicsekutu tanpa mendeklarasikan Itemkelas.

dynamic array = JsonConvert.DeserializeObject(json);
foreach(var item in array)
{
    Console.WriteLine("{0} {1}", item.temp, item.vcc);
}
LB
sumber
1
@ ChrisDevine Saya harap Anda tidak meletakkan jalan sebagai json. Itu harus konten file Anda.
LB
4
StreamReader ("file.json") membutuhkan aliran, bukan string
vg
13
Di C # DotNet Core, gunakan: using (StreamReader r = File.OpenText ("file.json"))
Fred
20
Untuk orang-orang yang tidak suka membaca jawaban lain untuk memahami yang satu ini: solusi ini memerlukan paket Json.net (Newtonsoft.Json)
Tydaeus
1
Karena Anda StreamReadertetap memiliki, akan lebih baik deserialize langsung dari stream menggunakan JsonTextReaderseperti yang ditunjukkan pada Can Json.NET membuat serial / deserialize ke / dari stream? . Itu r.ReadToEnd()tidak dibutuhkan.
dbc
43

Melakukan ini sendiri adalah ide yang buruk. Gunakan Json.NET . Ini telah memecahkan masalah dengan lebih baik daripada kebanyakan programmer jika mereka diberi waktu berbulan-bulan untuk menyelesaikannya. Adapun kebutuhan spesifik Anda, parsing ke dalam array dan semacamnya, periksa dokumentasi , khususnya pada JsonTextReader. Pada dasarnya, Json.NET menangani array JSON secara asli dan akan menguraikannya menjadi string, int, atau apa pun tipe yang terjadi tanpa diminta dari Anda. Berikut ini adalah tautan langsung ke penggunaan kode dasar untuk pembaca dan penulis, sehingga Anda dapat membuatnya terbuka di jendela cadangan saat Anda belajar untuk bekerja dengan ini.

Ini yang terbaik: Jadilah malas saat ini dan gunakan perpustakaan sehingga Anda memecahkan masalah umum ini selamanya.

tess
sumber
1
Saya menggunakan Json.net tetapi saya tidak mengerti cara kerjanya dengan benar. ketika saya membaca informasi menggunakan JsonTextReader ke dalam kotak teks saya mendapatkan setiap bit data tetapi juga header dll. Saya hanya ingin vaules di header. Saya telah mencoba membaca dokumentasi Json.NET tetapi saya tidak menemukannya menjelaskan semuanya cukup bagi saya untuk menggunakannya dengan cara yang saya inginkan
Chris Devine
@ChrisDevine "Json header"? Apakah Anda mengacu pada kunci? Mungkin ini akan lebih mudah jika Anda memposting potongan pendek (~ 10-15 baris) JSON dan arahkan ke apa yang Anda coba ekstrak.
tmesser
@ ChrisDevine Saya baru saja menambahkan komentar Anda di sini untuk pertanyaan Anda, jadi jika Anda bisa menghapus komentar di atas yang ini, itu akan bagus.
tmesser
@ ChrisDevine Juga, jika Anda bisa menjawab komentar saya pada pertanyaan Anda, itu juga akan luar biasa.
tmesser
1
@ ChrisDevine Ya, saya katakan saya taruh di pertanyaan Anda jadi tidak perlu lagi di sini.
tmesser
12

Berdasarkan solusi @ LB, kode VB (diketik Objectdaripada Anonymous)

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

Saya harus menyebutkan bahwa ini cepat dan berguna untuk membuat konten panggilan HTTP yang jenisnya tidak diperlukan. Dan menggunakan Objectdaripada Anonymousberarti Anda dapat mempertahankan Option Strict Ondi lingkungan Visual Studio Anda - Saya benci mematikannya.

SteveCinq
sumber
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
        }
Kanad Mehta
sumber
3

Untuk menemukan jalan yang benar saya gunakan

   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 menggunakan Path.PathSeparator dan memeriksa apakah path pertama sudah memiliki pemisah sehingga tidak akan menduplikasi pemisah. Selain itu, ia memeriksa apakah elemen jalan untuk menggabungkan memiliki karakter yang tidak valid.

Lihat https://stackoverflow.com/a/32071002/4420355

kuzdu
sumber
2
Cara yang lebih baik untuk menemukan jalur absolut terlepas dari aplikasinya: stackoverflow.com/questions/15653921/get-current-folder-path/…
user3326078
3

Untuk salah satu parse JSON, gunakan situs web http://json2csharp.com/ (cara termudah) untuk mengubah JSON Anda menjadi kelas C # untuk membatalkan deserialisasi JSON Anda menjadi objek 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; }        
 }

Kemudian gunakan JavaScriptSerializer (dari System.Web.Script.Serialization), jika Anda tidak ingin DLL pihak ketiga seperti newtonsoft.

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

Kemudian Anda bisa mendapatkan objek Anda dengan Items.name atau Items.Url dll.

Shailesh Gavathe
sumber
3

Ini juga dapat dilakukan dengan cara berikut:

JObject data = JObject.Parse(File.ReadAllText(MyFilePath));
Adrita Sharma
sumber