IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

JSON.NET problème pour parser données


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 68
    Par défaut JSON.NET problème pour parser données
    Bonjour,

    J'aimerais mettre tout un JSON dans un Dictionary<String, String>, il s'agit d'un fichier de données assez volumineux pouvant contenir objet/tableau et parfois des objets dans des objets, etc
    Les tableaux doivent former une chaîne de caractère chacun des éléments séparés par un |, exemple:
    clé: cars
    valeur: Ford|BMW|Fiat
    Je me suis fais un JSON de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    {
      "product": "test",
      "version": 3,
      "releaseDate": "2014",
      "demo": true,
      "cars": [
        "Ford",
        "BMW",
        "Fiat"
      ],
      "person": {
        "id": 12345,
        "name": "Guillaume",
        "phones": {
          "home": "0223456789",
          "mobile": "0723456789"
        },
        "email": [
          "email@outlook.fr",
          "email@gmail.com"
        ],
        "dateOfBirth": "1995",
        "preferedColours": [
          "Green",
          "Blue"
        ]
      }
    }
    et un projet en C# contenant une classe "parser":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
     
    class parser
    {
        private JObject document;
     
        public parser(JObject pDocument)
        {
            this.document = pDocument;
        }
     
        private String jArrayToString(JArray arrayJson)
        {
            String data = "";
            foreach (object item in arrayJson)
            {
                data += item.ToString() + "|";
            }
            return data;
        }
     
        public Dictionary<String, String> doIt()
        {
            Dictionary<String, String> result = new Dictionary<String, String>();
     
            foreach (var property in document.Properties())
            {
                if (property.Value is JValue) //si c'est une valeur brut
                {
                    result.Add(property.Name, property.Value.ToString());
                }
                else if (property.Value is JArray) //si c'est un array -> jArrayToString
                {
                    result.Add(property.Name, jArrayToString((JArray)property.Value));
                }
                else if (property.Value is JObject) //faudrait voir pour fonction récursive ?
                {
                    foreach (var x in property.Value)
                    {
                        result.Add(((JProperty)(x)).Name, ((JProperty)(x)).Value.ToString());
                    }
                }
            }
            return result;
        }
    }
    je récupère le json parsé de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    parser Parser = new parser(JObject.Parse(tbJson.Text));
    Dictionary<String, String> data = Parser.doIt();
    foreach (KeyValuePair<string, string> kvp in data)
      {
        Console.WriteLine("{0}:{1}", kvp.Key, kvp.Value);
      }
    ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    product:test
    version:3
    releaseDate:2014
    demo:True
    cars:Ford|BMW|Fiat|
    id:12345
    name:Guillaume
    phones:{
      "home": "0223456789",
      "mobile": "0723456789"
    }
    email:[
      "email@outlook.fr",
      "email@gmail.com"
    ]
    dateOfBirth:1995
    preferedColours:[
      "Green",
      "Blue"
    ]
    alors que je voudrais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    product:test
    version:3
    releaseDate:2014
    demo:True
    cars:Ford|BMW|Fiat|
    id:12345
    name:Guillaume
    home:0223456789
    mobile:0723456789
    email:email@outlook.fr|email@gmail.com|
    dateOfBirth:1995
    preferedColours:Green|Blue|
    Peut être que je devrais essayer de faire une fonction récursive qui s'appel dès lors que j'arrive sur un objet Json ? Ou qu'il existe un moyen plus simple et/ou plus propre de traiter mes données Json ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 966
    Par défaut
    Le problème ce situe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                 else if (property.Value is JObject) //faudrait voir pour fonction récursive ?
                {
                    foreach (var x in property.Value)
                    {
                        result.Add(((JProperty)(x)).Name, ((JProperty)(x)).Value.ToString());
                    }
                }
    property.value dans ton foreach fait référence à l'objet, pas à son contenu.

    Il faut bouclier sur (property.Value as JObject).Properties dans ce cas là.

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/06/2015, 20h17
  2. Parser données JSON
    Par caroen dans le forum Android
    Réponses: 22
    Dernier message: 24/10/2012, 10h42
  3. Réponses: 10
    Dernier message: 26/01/2012, 17h51
  4. Réponses: 2
    Dernier message: 03/05/2011, 10h20
  5. [VB.NET] Composant utilisée pour changer donnée access
    Par moust dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/04/2005, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo