Прочитайте и проанализируйте 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 и т.д.