it-swarm.com.ru

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

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

177
Chris Devine

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

Вы даже можете получить значения dynamically без объявления класса Item.

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

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

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

38
tmesser

Основываясь на решении @L.B., код (типизированный как Object вместо Anonymous) VB код

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

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

8
SteveCinq

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

   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://stackoverflow.com/a/32071002/4420355

1
kuzdu