Lee y analiza un archivo Json en C #

Pasé la mayor parte de los dos días haciendo “faffing” con muestras de código y etc., tratando de leer un archivo JSON muy grande en una matriz en c # para poder luego dividirlo en una matriz de 2d para su procesamiento.

El problema que tenía era que no podía encontrar ningún ejemplo de personas haciendo lo que yo estaba tratando de hacer. Esto significaba que solo estaba editando el código un poco esperando lo mejor.

Me las he arreglado para conseguir algo que funcione:

  • Lea el archivo Salga los encabezados y solo lea los valores en el conjunto.
  • Coloque una cierta cantidad de valores en cada línea de una matriz. (Entonces podría dividirlo y ponerlo en 2d array)

Esto se hizo con el siguiente código pero bloquea el progtwig después de ingresar algunas líneas en la matriz. Esto podría tener que ver con el tamaño del archivo.

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

Un fragmento del JSON con el que estoy trabajando es:

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

Necesito los valores de este JSON. Por ejemplo, necesito “3.54”, pero no me gustaría que imprima el “vcc”.

Espero que alguien me muestre cómo leer un archivo JSON y extraer solo los datos que necesito y ponerlos en una matriz o algo que pueda usar para luego ponerlos en una matriz.

¿Qué hay de hacer todas las cosas más fáciles?

 public void LoadJson() { using (StreamReader r = new StreamReader("file.json")) { string json = r.ReadToEnd(); List items = JsonConvert.DeserializeObject>(json); } } public class Item { public int millis; public string stamp; public DateTime datetime; public string light; public float temp; public float vcc; } 

Incluso puede obtener los valores aliados dynamic sin declarar la clase de Item .

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

Hacer esto usted mismo es una idea horrible. Use Json.NET . Ya ha resuelto el problema mejor de lo que la mayoría de los progtwigdores podrían si tuvieran meses para trabajar en él. En cuanto a sus necesidades específicas, análisis en matrices y JsonTextReader , consulte la documentación , especialmente en JsonTextReader . Básicamente, Json.NET maneja las matrices JSON de forma nativa, y las analizará en cadenas, enteros, o lo que sea que el tipo sea, sin que usted lo solicite. Aquí hay un enlace directo a los usos básicos del código tanto para el lector como para el escritor, por lo que puede tenerlo abierto en una ventana libre mientras aprende a trabajar con esto.

Esto es lo mejor: sea perezoso esta vez y use una biblioteca para que resuelva este problema común para siempre.

Basado en la solución de @LB, el código VB (escrito como Object lugar de Anonymous ) es

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

Debo mencionar que esto es rápido y útil para construir contenido de llamadas HTTP donde el tipo no es obligatorio. Y usar Object lugar de Anonymous significa que puede mantener Option Strict On en su entorno de Visual Studio. Detesto apagarlo.

Para encontrar el camino correcto que estoy usando

  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 utiliza Path.PathSeparator y comprueba si la primera ruta ya tiene un separador al final, por lo que no duplicará los separadores. Además, comprueba si los elementos de ruta para combinar tienen caracteres no válidos.

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