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

Langage Delphi Discussion :

Traiter un array JSON


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut Traiter un array JSON
    Bonjour,

    j'ai une valeur de ce type,
    [{"id":"1","value":"rouge"},{"id":"2","value":"red"}]
    un tableau JSON donc.
    Je veux récupérer la valeur "value" de la première ligne du tableau soit : rouge

    je pourrai utiliser les expressions régulières mais comme c'est un tableau JSON il y a certainement un moyen plus facile , sauf que je suis plutôt noob ave JSON.

    Comment procéder ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Je crois avoir trouvé, même si je pense en faire un peu trop dans ce code
    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
     
    procedure TDataPrestashop.FDAttribValeurCalcFields(DataSet: TDataSet);
    var j : String; // i.e [{"id":"1","value":"rouge"},{"id":"2","value":"red"}]
        jv: TJSONValue; // parsing
        ov : TJSONValue; // objet json 
    begin
    j:=FDAttribValeurname.asString;
    if j.IsEmpty
     then  Dataset['Valeur']:=''
     else begin
         Jv:=TJSonObject.ParseJSONValue(j);
         if assigned(jv) then
          begin
            ov:=jv;
            Dataset['Valeur']:=TJSONArray(ov).Items[0].GetValue<String>('value');
          end
          else Dataset['Valeur']:='';
          jv.Free;
       end;
    end;
    j'ai bien le résultat souhaité
    Nom : Capture.PNG
Affichages : 157
Taille : 22,2 Ko

    j'ai galéré pour comprendre que je ne pouvais utiliser Jv directement

  3. #3
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Bien joué.

    (cf mon bon vieil exemple de pianos en gare avec l'API lourdingue de la SNCF)

    En effet tout ce qui vient de System.JSON traite des TJSONValue à transtyper systématiquement pour s'en servir dans le bon format. On peut aussi jouer avec un TJSONReader si on veut (pas forcément plus simple ni plus court d'ailleurs).

    A noter que depuis 11 Alexandria la fonction ParseJSONValue() est descendue sur le TJSONValue et donc appelle sur chaque type, plus besoin de l'utiliser sur les objets pour récupérer autre chose.

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    pour ma part, j'utilise mon unité Execute.JSON évidemment

    elle est très pratique pour sérialiser/désérialiser des record

    du coup

    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
     
    uses
      Execute.JSON;
     
    type
      TValue = record
        id: string;
        value: string;
      end;
      TValues = TArray<TValue>;
    var
      Values: TValues;
    begin
      Values := JSON.fromJSON('[{"id":"1","value":"rouge"},{"id":"2","value":"red"}]');
    end;
    alors évidement si tu ne veux que le premier élément et que le JSON peut en contenir potentiellement des milliers, c'est pas top vu que tu vas créer un tableau immense pour pas grand chose...

    mais à la rigueur tu peux utiliser TJSONParser, en t'inspirant de TJSONParser.ParseJSONDynArray()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    uses
      Execute.JSON;
    begin
      var Parser := TJSONParser.Create('[{"id":"1","value":"rouge"},{"id":"2","value":"red"}]');
      if Parser.Skip('[') then
      begin 
       var Value: TValue;
        Parser.ParseType(@Value, TypeInfo(TValue)); // lire uniquement le premier élément
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je crois avoir trouvé, même si je pense en faire un peu trop dans ce code
    Trop de lignes mais en réalité tu n'en fais pas assez, à moins d'être certain que la chaîne est :

    1. Un JSon valide (ça tu le fais par Assigned) ;
    2. Un tableau ;
    3. Que ce tableau contienne au moins un élément ;
    4. Que l'élément possède une donnée value récupérable sous forme de chaîne.


    L'ensemble de ces tests peuvent être résumés ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var JSon  := TJSonObject.ParseJSONValue(j);
    var Value := '';
     
    if (JSon is TJSONArray) and (TJSONArray(JSon).Count > 0) then
      TJSONArray(JSon)[0].TryGetValue<string>('value', Value)


    Citation Envoyé par SergioMaster Voir le message
    j'ai galéré pour comprendre que je ne pouvais utiliser Jv directement
    Pourtant si

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Merci à tous

    @AndnotOr je suis certain de la chaine et de la structure puisque le texte vient en realité d'un interrogation REST (API Prestashop), d'où les raccourcis que je peux prendre, je ne vais pas ajouter bretelles et ceinture pour un truc fixe
    @Paul le tableau ne sera jamais important, il s'agit d'un tableau de traduction en diverses langues et se limite acuellement à FR et EN mais c'est vrai s'il s'agissait d'un tableau plus gros au pire je m'attends à l'ajout de DE/EN/IT sans trop y croire


    Citation Envoyé par AndnotOr
    Pourtant si
    Je n'ai jamais pu avec 10.3 faire TJSONArray(JSon) (erreur de syntaxe) PPrem mets certainement le doigt dessus en indiquant
    la fonction ParseJSONValue() est descendue sur le TJSONValue

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    je ne vais pas ajouter bretelles et ceinture pour un truc fixe
    On en reparlera quand tu perdras ton pantalon
    Qu'est-ce qui est définitivement figé en informatique ?

    Citation Envoyé par SergioMaster Voir le message
    Je n'ai jamais pu avec 10.3 faire TJSONArray(JSon) (erreur de syntaxe) ...
    Et ton exemple est fait sous quelle version alors parce que c'est exactement ce que tu nous montres (TJSONArray(ov))

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Et ton exemple est fait sous quelle version alors parce que c'est exactement ce que tu nous montres (TJSONArray(ov))
    10.3 et j'ai été obligé de passer par une seconde variable ov et non directement (ce qui eut été plus agréable) sur le parser jv

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un array json
    Par theskinline01 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/05/2016, 18h31
  2. Lire un php array json a partir de javascript
    Par learningcode dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/03/2015, 00h01
  3. result arrays JSON pour alimenter une graph achartengine
    Par andronull dans le forum Android
    Réponses: 0
    Dernier message: 28/04/2014, 15h38
  4. Fenêtre modale : Array Json vers un format html
    Par wpast dans le forum jQuery
    Réponses: 6
    Dernier message: 31/01/2014, 08h35
  5. Lire et traiter un array d'un classeur fermé
    Par Jertom dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/10/2013, 23h02

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