Прочитайте и проанализируйте Json файл в С#

Я потратил большую часть двух дней на "пробку" с примерами кода и т.д., пытаясь прочитать очень большой файл JSON в массив в С#, чтобы впоследствии я смог разбить его на 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

Как насчет того, чтобы сделать все проще с 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);
}

Ответ 2

Делать это самостоятельно - ужасная идея. Используйте Json.NET. Это уже решило проблему лучше, чем большинство программистов, если бы им давали месяцы подряд на работу над ней. Что касается ваших конкретных потребностей, разбора на массивы и тому подобное, проверьте документацию, особенно на JsonTextReader. По сути, Json.NET изначально обрабатывает массивы JSON и будет разбирать их на строки, целые или любые другие типы без запроса от вас. Вот прямая ссылка на базовое использование кода как для читателя, так и для писателя, так что вы можете открыть его в свободном окне, пока вы учитесь работать с этим.

Это к лучшему: будьте ленивы на этот раз и используйте библиотеку, чтобы решить эту распространенную проблему навсегда.

Ответ 3

Основанный на решении @LB, VB-код (типизированный как Object а не Anonymous)

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

Я должен отметить, что это быстро и полезно для создания содержимого HTTP-вызова, где тип не требуется. И использование Object вместо Anonymous означает, что вы можете поддерживать Option Strict On в вашей среде Visual Studio - я ненавижу это отключать.

Ответ 4

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
        }

Ответ 5

Для нахождения правильного пути я использую

   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 и проверяет, имеет ли первый путь уже разделитель в конце, чтобы он не дублировал разделители. Кроме того, он проверяет, имеют ли элементы пути для объединения недопустимые символы.

См. fooobar.com/questions/454389/...

Ответ 6

Для любого анализа JSON используйте веб-сайт http://json2csharp.com/ (самый простой способ), чтобы преобразовать ваш JSON в класс С#, чтобы десериализовать ваш JSON в объект С#.

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

Затем вы можете получить свой объект с помощью Items.name или Items.Url и т.д.