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

Delphi Discussion :

[Delphi 11.3] du bon usage de system.JSON


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 026
    Par défaut [Delphi 11.3] du bon usage de system.JSON
    Bonjour,

    Je bute sur une chose qui me semblait simple au premier abords, mais je ne trouve pas ou j'ai "merdu", si je pouvais bénéficier de votre regards expert pour me dire ou cela pèche, je vous en serait reconnaissant...

    Je télécharge un fichier JSON, en et une foi en mémoire, je cherche a le parser pour en extraire tout les éléments qui le compose.

    Contenu du JSON:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [{"Colonies":"Les colonies"},{"Creatures":"Les r\u00e9atures"},{"Geneticiens":"Les g\u00e9n\u00e9ticiens"},{"Lieux":"Les lieux"},{"Mercenaires":"les mercenaires"},{"Nations":"Les nations"},{"Navires":"Les navires"},{"Personnages":"Les personnages"},{"Pirates":"Les pirates"},{"Reperes":"Les rep\u00e8res"},{"Societes":"Les soci\u00e9t\u00e9s"},{"Surfaces":"La surface"},{"Villes":"Les villes"}]
    Et voici les bouts de codes:
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    type
      ASyncJSonEvent = procedure(const AValue: Integer; const AString: string) of object;
     
    /////////////////////////////////////
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      GetJSonFile('http://www.atlaspolaris.com/restful/listes.json', ParseJson);
    end;
     
    procedure TForm1.GetJsonFile(AUrl: string; AAfficheData: ASyncJSonEvent);
    begin
      TThread.CreateAnonymousThread(
      procedure
      var
        LData: string;
        LStatus: Integer;
        LClient: THTTPClient;
        LReponse: IHTTPResponse;
      begin
        LData   := EmptyStr;
        LStatus := 0;
     
        LClient := THTTPClient.Create;
        try
          LReponse := LClient.Get(AUrl);
          LStatus := LReponse.StatusCode;
     
          if LReponse.StatusCode = 200 then
            LData := TJSONObject.ParseJSONValue(LReponse.ContentAsString).ToString
          else
            LData := LReponse.StatusText;
        finally
          LClient.Free;
        end;
     
        TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin
          AAfficheData(LStatus, LData);
        end);
      end)
      .Start;
    end;
     
    procedure TForm1.ParseJson(const AStatus: integer; const AValue: string);
    var
      LValue: TJSONValue;
      LObject: TJSONObject;
      LPair: TJSONPair;
      I: integer;
    begin
      if AStatus = 200 then
      begin
        LValue := TJSONObject.ParseJSONValue(AValue);
        LObject := TJSONObject(LValue);
     
        for i := 0 to pred(LObject.Count) do
        begin
          LPair := LObject.Pairs[I];
     
          SynEdit1.Lines.Add(LPair.JsonString.Value);
          SynEdit1.Lines.Add(LPair.JsonValue.ToString);
        end;
      end;
    end;
    Cela plante a ces lignes la sans que je comprenne pourquoi, surement une érreur de ma part mais je ne vois pas ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          SynEdit1.Lines.Add(LPair.JsonString.Value);
          SynEdit1.Lines.Add(LPair.JsonValue.ToString);
    Une idée de l'erreur que j'ai commise ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 041
    Par défaut
    J'utilise tout le temps "VRequest.Response.JSONValue.TryGetValue" sans Thread supplémentaire car je code 99.9% dans un serveur déjà tout en thread.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    Bizarrement formaté ce fichier ; un tableau avec des éléments contenant des entrées systématiquement différentes

    As-tu bien commencé par énumérer les éléments du tableau ?

  4. #4
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 026
    Par défaut
    Alors, voici 2 copies d'écrans de ma tentative de debug avant que Delphi plante lamentablement:

    Nom : Bug-1.jpg
Affichages : 103
Taille : 242,1 Ko

    Suivi de :
    Nom : Bug-2.jpg
Affichages : 96
Taille : 133,3 Ko
    Après, Delphi plante et se referme !

  5. #5
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 026
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Bizarrement formaté ce fichier ; un tableau avec des éléments contenant des entrées systématiquement différentes

    As-tu bien commencé par énumérer les éléments du tableau ?
    Pas compris, je débute avec System.JSON, pourrais-tu préciser ta pensée ?

    [EDIT]
    Je crois que j'ai compris ta remarque, tu veux dire qu'en fait au vu de la structure, elle ne devrait pas être dans un ARRAY JSON, et dont le contenu du fichier JSON ne devrait pas etre compris entre [], c'est cela ?

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 041
    Par défaut
    Comme tu fais ParseJSONValue / ToString, tu as déjà lu le JSON une fois, ensuite tu le relis dans ParseJson, double lecture du JSON, est-ce utile ?
    Je ferais une ParseJSONValue une fois, que je recopierais dans une structure maison (objet métier ou un objet moins pénible que TJSONObject) et je passerais cette structure maison à la fonction Affichage

    Je ne parle même pas des fuites mémoire de ton code, tu ne libères rien !


    Sinon oui, ton JSON devrait être plutot
    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"clé1": "valeur", "clé2": "valeur", "clé3": "valeur"}, {"clé1": "valeur", "clé2": "valeur", "clé3": "valeur"}]
    .
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 026
    Par défaut
    Ok, j'ai fait évoluer mon JSON:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"Colonies":"Les colonies","Creatures":"Les cr\u00e9atures","Geneticiens":"Les g\u00e9n\u00e9ticiens","Lieux":"Les lieux","Mercenaires":"les mercenaires","Nations":"Les nations","Navires":"Les navires","Personnages":"Les personnages","Pirates":"Les pirates","Reperes":"Les rep\u00e8res","Societes":"Les soci\u00e9t\u00e9s","Surfaces":"La surface","Villes":"Les villes"}
    et j'ai modifié ma fonction ainsi et j'ai bien ce que je veux en sortie:
    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
     
    procedure TForm1.ParseJson(const AStatus: integer; const AValue: string);
    var
      LValue: TJSONValue;
      LObject: TJSONObject;
      LPair: TJSONPair;
    begin
      if AStatus = 200 then
      begin
        LValue := TJSONObject.ParseJSONValue(AValue);
        LObject := TJSONObject(LValue);
     
        for LPair in LObject do
        begin
          SynEdit1.Lines.Add(LPair.JsonString.Value);
          SynEdit1.Lines.Add(LPair.JsonValue.Value);
        end;
      end;
    end;

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

Discussions similaires

  1. UNIX, AIX, du bon usage de la commande system
    Par Emmanuel Lecoester dans le forum Bibliothèque standard
    Réponses: 19
    Dernier message: 11/02/2008, 17h16
  2. Bon Usage : Constructeur ou Load
    Par gridin dans le forum VB.NET
    Réponses: 1
    Dernier message: 10/05/2007, 07h48
  3. [Delphi - Firebird] Comment faire bon usage des transactions?
    Par Lili21 dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 07/05/2007, 20h59
  4. Quel est le bon usage des fichiers "*.bpk" ?!
    Par bnadem35 dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/09/2006, 17h31
  5. [xml] bon usage du xml
    Par Jeddo dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 02/05/2005, 16h49

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