C # Json dosyasını okuyun ve ayrıştırın


239

Ben kod örnekleri ve vb ile hakkında "faffing" iki gün en iyi parçası geçirdim, böylece daha sonra işleme için 2d diziye bölünebilir böylece c # bir dizi içine çok büyük bir JSON dosyası okumaya çalışıyorum.

Yaşadığım sorun, yapmaya çalıştığım şeyi yapan insanların örneklerini bulamadım. Bu sadece en iyisi için umut biraz kod düzenleme anlamına geliyordu.

Çalışacak bir şey elde etmeyi başardım:

  • Miss out başlıkları dosyasını okuyun ve sadece diziye değerleri okuyun.
  • Bir dizinin her satırına belirli miktarda değer yerleştirin. (Böylece daha sonra 2d dizisine bir put bölebilirim)

Bu, aşağıdaki kodla yapıldı, ancak diziye birkaç satır girdikten sonra programı kilitliyor. Bunun dosya boyutu ile ilgili olması gerekebilir.

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

Birlikte çalıştığım JSON'un bir pasajı:

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

Ben bu JSON değerleri gerekir. Örneğin, "3.54" gerekir, ancak "vcc" yazdırmak istemem.

Birisi bana bir JSON dosyasını okumak ve sadece ihtiyacım olan verileri ayıklamak ve daha sonra bir dizi koymak için kullanabileceğiniz bir dizi veya bir şey koymak koymak nasıl umuyoruz umuyorum.


1
Programınız çöktüğünde hangi istisnayı atar?
tmesser

Yanıtlar:


484

Json.NET ile her şeyi kolaylaştırmaya ne dersiniz ?

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

Sınıf dynamicbildirmeden müttefikleri bile alabilirsiniz Item.

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

1
@ChrisDevine Umarım yolu böyle koymamışsın json. Dosyanızın içeriği olmalıdır.
LB

4
StreamReader ("file.json") bir dize değil dizeye ihtiyaç duyuyor
vg

13
C # DotNet Core'da şunları kullanın: (StreamReader r = File.OpenText ("file.json"))
Fred

20
Bunu anlamak için diğer cevapları okumayı sevmeyenler için: bu çözüm için Json.net paketi (Newtonsoft.Json) gerekir
Tydaeus

1
Her StreamReaderneyse, Json.NET'te bir akışa serileştirebilir / serisini kaldırabilir miyim? BölümündeJsonTextReader gösterildiği gibi doğrudan akıştan serileştirmeyi kaldırmak daha iyi olur. . Gerekli r.ReadToEnd()değildir.
dbc

43

Bunu kendiniz yapmak korkunç bir fikirdir. Json.NET kullanın . Sorun, çoğu programcının üzerinde çalışmak için aylarca verildiyse, çoğu sorunu çözebileceğinden daha iyi çözdü. Özel ihtiyaçlarınız için, dizilere ayrılma vb. Belgelere bakın özellikle bakın JsonTextReader. Temel olarak, Json.NET JSON dizilerini yerel olarak işler ve sizden sormadan dizeleri, ints'ları veya türün ne olduğunu ayrıştırır. İşte hem okuyucu hem de yazar için temel kod kullanımlarına doğrudan bir bağlantı, böylece bununla çalışmayı öğrenirken yedek bir pencerede açabilirsiniz.

Bu en iyisi: Bu sefer tembel olun ve bir kütüphane kullanın, böylece bu ortak sorunu sonsuza kadar çözebilirsiniz .


1
Json.net kullanıyorum ama nasıl düzgün çalıştığını anlamıyorum. i bir metin kutusuna JsonTextReader kullanarak bilgileri okuduğumda ben veri her bit ama aynı zamanda başlıklar vb olsun. Ben sadece başlıklarda vaules istiyorum. Json.NET belgelerini okumaya çalıştım ama benim istediğim şekilde kullanmak için yeterli her şeyi açıklıyor bulamadı
Chris Devine 21

@ChrisDevine "Json başlıkları"? Anahtarlardan mı bahsediyorsun? JSON'un kısa bir (~ 10-15 satır) snippet'ini yayınladıysanız ve tam olarak ne çıkarmaya çalıştığınıza işaret ederseniz, bu daha kolay olurdu.
tmesser

@ChrisDevine Yorumunuzu buraya sorunuza ekledim, bu yüzden yukarıdaki yorumu nazikçe silebilirseniz harika olurdu.
tmesser

@ChrisDevine Ayrıca, sorunuza verdiğiniz yorumu da yanıtlarsanız harika olurdu.
tmesser

1
@ChrisDevine Evet, diyorum ki sorunuza soruyorum bu yüzden burada artık gerekli değil.
tmesser

12

@ LB'nin çözümüne dayanarak, ( Objectyerine yazılır Anonymous) VB kodu

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

Bunun türün gerekli olmadığı yerlerde HTTP çağrı içeriği oluşturmak için hızlı ve kullanışlı olduğunu belirtmeliyim. Ve Objectyerine Visual Studio ortamınızda Anonymouskoruyabileceğiniz anlamına gelir Option Strict On- bunu kapatmaktan nefret ediyorum.


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

Kullandığım doğru yolu bulmak için

   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 öğesini kullanır ve ilk yolun sonunda zaten bir ayırıcı olup olmadığını kontrol eder, böylece ayırıcıları çoğaltmaz. Ayrıca, birleştirilecek yol öğelerinin geçersiz karakterlere sahip olup olmadığını denetler.

Bkz. Https://stackoverflow.com/a/32071002/4420355


2
Uygulamadan bağımsız olarak mutlak yol bulmanın daha iyi yolu: stackoverflow.com/questions/15653921/get-current-folder-path/…
user3326078 17:19

3

JSON ayrıştırma işlemlerinden herhangi biri için, JSON'unuzu C # nesnesine serileştirmek üzere JSON'unuzu C # sınıfına dönüştürmek için http://json2csharp.com/ (en kolay yolu) web sitesini kullanın .

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

Sonra newtonsoft gibi üçüncü taraf DLL istemiyorsanız JavaScriptSerializer'ı (System.Web.Script.Serialization) kullanın.

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

Ardından nesnenizi Items.name veya Items.Url vb. İle alabilirsiniz.


3

Bu, aşağıdaki şekilde de yapılabilir:

JObject data = JObject.Parse(File.ReadAllText(MyFilePath));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.