Ler e analisar um arquivo Json em c #

Eu gastei a melhor parte de dois dias “faffing” com amostras de código e etc., tentando ler um arquivo JSON muito grande em uma matriz em c # para que eu possa dividi-lo posteriormente em uma matriz 2d para processamento.

O problema que eu estava tendo era que eu não conseguia encontrar nenhum exemplo de pessoas fazendo o que eu estava tentando fazer. Isso significava que eu estava apenas editando o código um pouco e esperando o melhor.

Eu consegui fazer algo funcionar que irá:

  • Leia o arquivo. Exclua os headers e apenas leia os valores em array.
  • Coloque uma certa quantidade de valores em cada linha de uma matriz. (Então eu poderia depois dividi-lo em um array 2D)

Isso foi feito com o código abaixo, mas ele trava o programa depois de inserir algumas linhas no array. Isso pode ter a ver com o tamanho do arquivo.

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

Um trecho do JSON com o qual estou trabalhando é:

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

Eu preciso dos valores deste JSON. Por exemplo, eu preciso de “3.54”, mas eu não quero que ele imprima o “vcc”.

Eu espero que alguém possa me mostrar como ler um arquivo JSON e extrair apenas os dados que eu preciso e colocá-los em uma matriz ou algo que eu possa usar para depois colocar em uma matriz.

Que tal tornar tudo mais fácil?

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

Você pode até obter os valores dynamic sem declarar a class Item .

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

Fazer isso sozinho é uma ideia terrível. Use o Json.NET . Ele já resolveu o problema melhor do que a maioria dos programadores poderia se eles estivessem com meses de atraso para trabalhar nele. Quanto às suas necessidades específicas, analisando matrizes e tal, verifique a documentação , especialmente no JsonTextReader . Basicamente, o Json.NET lida com arrays JSON nativamente, e irá analisá-los em strings, ints, ou qualquer que seja o tipo, sem perguntar por você. Aqui está um link direto para os usos básicos do código tanto para o leitor quanto para o gravador, para que você possa abrir uma janela sobressalente enquanto aprende a trabalhar com isso.

Isto é para o melhor: seja preguiçoso desta vez e use uma biblioteca para resolver este problema comum para sempre.

Baseado na solução @ LB, o código VB (typescript como Object ao invés de Anonymous ) é

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

Devo mencionar que isso é rápido e útil para a construção de conteúdo de chamadas HTTP onde o tipo não é obrigatório. E usar Object vez de Anonymous significa que você pode manter Option Strict On em seu ambiente do Visual Studio – eu odeio desligar isso.

Para encontrar o caminho certo que estou 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 usa o Path.PathSeparator e verifica se o primeiro caminho já possui um separador no final, para não duplicar os separadores. Além disso, ele verifica se os elementos do caminho a serem combinados possuem caracteres inválidos.

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