web-dev-qa-db-fra.com

Lire et analyser un fichier Json en C #

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:

  • Lire le fichier Ne renseignez pas les en-têtes et ne lisez que les valeurs dans un tableau.
  • Placez une certaine quantité de valeurs sur chaque ligne d'un tableau. (Donc, je pourrais plus tard diviser un put en tableau 2D)

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.

191
Chris Devine

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 dynamically sans déclarer Item class.

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

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.

39
tmesser

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.

9
SteveCinq
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
        }
3
user3192640

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.

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

1
kuzdu