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 :

JSON en Delphi


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut JSON en Delphi
    Bonjour,

    J'ai un projet à faire dans lequel je dois faire transiter des infos entre Delphi et un portail PHP.
    Je souhaite le réaliser en JSON et j'ai donc commencé à investiguer sur la techno coté Delphi.

    Je me heurte à quelques difficultés. J'ai du mal de trouver des tutos intéressants. J'ai commencé à travailler avec les classes de bases de Delphi, et je rencontre des difficultés.

    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
    TContrat =class
    private
      FdDateDeb: TDate;
    public
       property dDateDeb: TDate read FdDateDeb write FdDateDeb;
    end;
    
    TApprenant =class
    private
       FsNom   :string;
       [JSONName('ListContrat')]
       FListContrat: TObjectList<TContrat>;
    public
       property sNom   :string read FsNom write FsNom;
       property ListContrat: TObjectList<TContrat> read FListContrat write FListContrat;
    end;
    
    ...
    procedure TForm3.Button2Click(Sender: TObject);
    var
       apprenant : TApprenant;
       contrat : TContrat;
    begin
       Memo1.Clear;
    
       apprenant := TApprenant.Create;
       apprenant.sNom :='JEAN';
    
       contrat := TContrat.Create;
       contrat.dDateDeb := StrToDate('01/01/2015');
       apprenant.ListContrat.Add(contrat);
    
       contrat := TContrat.Create;
       contrat.dDateDeb := StrToDate('01/01/2016');
       apprenant.ListContrat.Add(contrat);
    
       Memo1.Lines.Add(TJson.ObjectToJsonString(apprenant));end;
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
        "sNom": "JEAN",
        "ListContrat": {
            "ownsObjects": true,
            "items": [{
                "dDateDeb": 42005,
            },{
                "dDateDeb": 42370,
            }],
            "count":2,
            "arrayManager":{}
        }}
    Dans cette exemple la sérialisation du la TObjectList<> m'a donné des données genre "ownsObjects" que je ne souhaite pas voir (pas d'intérêt pour PHP).

    Comment enlever ce genre d'info ?
    Est la meilleur solution pour faire du JSON ? Doit-on passer par un autre frameWork, ... ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Quid d'un TList au lieu du TObjectList ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Quid d'un TList au lieu du TObjectList ?
    Peu importe le type, j'ai toujours des données parasites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    {
    	"sNom": "JEAN",
    	"sPrenom": "Paul",
    	"ListContrat": {
    		"items": [{
    			"dDateDeb": 42370,
    			"dDateFin": 42735
    		}],
    		"count": 1,
    		"arrayManager": {}
    	}
    }
    "count": 1 et "arrayManager": sont 2 propriétés induites par la TList<>

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Est-ce que tu as déjà regardé du côté de mORMot ? http://blog.synopse.info/post/2013/1...-serialization

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Si avec un TList les propriétés parasites sont toujours les dernières, il doit suffire de charger la chaîne dans un TStringList et de faire successivement autant de Delete[Count-2] que de propriétés inutiles
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    J'ai trouvé une solution en passant directement par TJSONMarshal et RegisterConverter

    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
     
       m := TJSONMarshal.Create(TJSONConverter.Create);
     
     
       m.RegisterConverter(TApprenant, 'FListContrat',
          function(Data: TObject; Field: String): TListOfObjects
          var
             ContratApp: TContrat;
             I: integer;
          begin
             SetLength(Result, TApprenant(Data).ListContrat.Count);
     
     
             I := Low(Result);
             for ContratApp in TApprenant(Data).ListContrat do
             begin
                Result[I] := ContratApp;
                Inc(I);
             end;
          end);
     
     
          m.Marshal(apprenant).ToString;
    Je m'étais fait avoir car le TJSONMarshal est dans 2 uses Delphi.
    - REST.Json => marche très bien.
    - Data.DBXJSONReflect => laisse des propriétés parasites.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Effectivement Data.DBXJSONReflect.TJSONMarshal c'est l'ancien sérialisez de Delphi XE2, plutôt à utilisation interne de Delphi avec une gestion de type implicite assez lourde en interne
    REST.Json.TJSONMarshal c'est le nouveau, apparu en XE6 ou XE7 conçu pour que nous puissions l'utiliser mais nous oblige à spécifier le type attendu pour le parsage

    Je l'évoquais dans ce sujet, où j'ai fourni un petit code pour faciliter l'utilisation de Data.DBXJSONReflect.TJSONMarshal mais qui laisse tout un tas de valeur nécessaire pour faire le parsage JSON -> Object sous XE2

    Il existe aussi Data.DBXJSON.TJSONObject ou l'on peut manipuler le JSON à la main complètement, un peu comme on le ferait avec du XML avec TXMLDocument en balayant Nodes et Attributes
    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

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    J'ai créé ma propre unité JSON qui n'est peut-être pas complète car très orientée sur mon besoin au moment de sa conception.

    cependant son code reste à mon avis beaucoup plus lisible que celui d'Embarcadero, et plus sûr que celui de XE8 en tout cas

    http://lookinside.free.fr/delphi.php?Delphi+XE8+et+JSON
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    @Paul TOTH: dans les 2 et 3ème exemples, il me semble qu'il y a une erreur de déclaration non (o de type TSimpleObject et pas TMonObjet) ?

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    oui, il devait être tard quand j'ai rédigé cela j'ai relevé d'énormes fautes de français...même s'il en reste probablement ...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Delphi et JSON
    Par Paul TOTH dans le forum Contribuez
    Réponses: 3
    Dernier message: 01/09/2015, 10h23
  2. Delphi XE7 et JSON
    Par XDavidX dans le forum Delphi
    Réponses: 7
    Dernier message: 05/03/2015, 18h49
  3. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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