J'ai passé la majeure partie de mes deux jours à "jouer" avec des exemples de code, etc., en essayant de lire un très gros fichier JSON dans un tableau en c # afin de pouvoir le scinder ultérieurement en un tableau en 2D.
Le problème que je rencontrais était que je ne pouvais trouver aucun exemple de personnes faisant ce que j'essayais de faire. Cela signifiait que je ne faisais que modifier le code dans l'espoir du meilleur.
J'ai réussi à faire fonctionner quelque chose qui:
Cela a été fait avec le code ci-dessous, mais le programme a été bloqué après l’entrée de quelques lignes dans le tableau. Cela peut avoir à voir avec la taille du fichier.
// 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 extrait du JSON avec lequel je travaille est:
[
{ "millis": "1000",
"stamp": "1273010254",
"datetime": "2010/5/4 21:57:34",
"light": "333",
"temp": "78.32",
"vcc": "3.54" },
]
J'ai besoin des valeurs de ce JSON. Par exemple, j'ai besoin de "3.54", mais je ne voudrais pas qu'il imprime le "vcc".
J'espère que quelqu'un pourra me montrer comment lire un fichier JSON et extraire uniquement les données dont j'ai besoin et les placer dans un tableau ou quelque chose que je pourrai utiliser ultérieurement.
Pourquoi ne pas simplifier les choses avec 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;
}
Vous pouvez même obtenir les valeurs dynamic
ally sans déclarer Item
class.
dynamic array = JsonConvert.DeserializeObject(json);
foreach(var item in array)
{
Console.WriteLine("{0} {1}", item.temp, item.vcc);
}
Faire cela vous-même est une idée affreuse. Utilisez Json.NET . Il a déjà résolu le problème mieux que la plupart des programmeurs s’il disposait de plusieurs mois pour le résoudre. En ce qui concerne vos besoins spécifiques, analyse dans des tableaux et autres, vérifiez le documentation , en particulier sur JsonTextReader
. Fondamentalement, Json.NET gère les tableaux JSON de manière native et les analysera en chaînes, entêtes ou quel que soit le type, sans que vous le demandiez. Here est un lien direct vers les utilisations de code de base pour le lecteur et le rédacteur. Vous pouvez donc le laisser ouvert dans une fenêtre de secours pendant que vous apprenez à travailler avec cela.
C’est pour le mieux: soyez paresseux cette fois et utilisez une bibliothèque pour résoudre ce problème courant pour toujours.
Basé sur la solution de @L.B., le code (saisi sous la forme Object
plutôt que Anonymous
) VB est
Dim oJson as Object = JsonConvert.DeserializeObject(File.ReadAllText(MyFilePath))
Je devrais mentionner que ceci est rapide et utile pour construire un contenu d'appel HTTP où le type n'est pas requis. Et utiliser Object
plutôt que Anonymous
signifie que vous pouvez conserver Option Strict On
dans votre environnement Visual Studio - je déteste le désactiver.
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
}
Pour trouver le bon chemin, j'utilise
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 utilise Path.PathSeparator et vérifie si le premier chemin a déjà un séparateur à la fin afin de ne pas dupliquer les séparateurs. En outre, il vérifie si les éléments de chemin à combiner ont des caractères non valides.