Partage
  • Partager sur Facebook
  • Partager sur Twitter

Class ES6 depuis données JSON

Sujet résolu
    25 mai 2017 à 13:50:34

    Bonjour,

    ça fais maintenant quelques heures que je me demande, comment pourrais-je créer une class ES6 depuis des données JSON ?
    Je m'explique, par exemple mon JSON :

    {
    	"name": "Sapuraizu",
    	"hobbies": ["Development", "Sport"]
    	"isFemale": false
    	"bankAccount": 154154
    }

    et avec ce JSON une class serait automatiquement créée, ce qui donnerait :

    class ClassName {
    	constructor(){
    		this.name = null;
    		this.hobbies = [];
    		this.isFemale = false;
    		this.bankAccount = 0;
    	}
    }

    Ou même une class typée en TypeScript si nécéssaire.
    Si j'ai mal expliqué quelque chose dîtes le moi :/

    Je vous remercie d'avance! :p

    EDIT 1 : Peut-être que le terme de "Réflection" vous parlera + qu'à moi


    -
    Edité par Sapuraizu 25 mai 2017 à 13:54:19

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      25 mai 2017 à 15:38:47

      Si tu cherches juste à pouvoir accéder aux propriétés de l'objet à la mode o.hobbies, ce n'est pas la peine de créer une classe : un simple coup de JSON.parse('...') fera l'affaire.

      As-tu plusieurs objets à créer à la suite ? Ou bien ton JSON ne contient-il qu'un seul objet ?
      Que veux-tu faire réellement avec cet objet ?

      Novax.

      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2017 à 16:17:17

        Nop, comme expliqué, j'ai bel et bien besoin de faire comme je l'ai expliqué et pas autrement.
        Je cherche simplement à enregistrer sous forme de class des json que je reçois aléatoirement.

        Les JSON sont formés "aléatoirement" donc j'ai besoin d'un système sûrement pas à la porté de tous le monde pour transformer n'importe quel JSON en Class que je peux réutiliser ensuite ;)

        En gros, j'ai simplement besoin de savoir comment transformer un Json en Class ES6/Typescript et rien d'autre :p

        Merci d'avoir répondu!

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          25 mai 2017 à 16:34:15

          Code ta classe dans une string.

          EDIT : Je n'y connais rien, mais peut-être que les Proxy peuvent t'aider ?

          -
          Edité par Anonyme 25 mai 2017 à 16:35:04

          • Partager sur Facebook
          • Partager sur Twitter
            25 mai 2017 à 21:01:34

            Nop tu n'as pas compris :/ J'ai un JSON aléatoire et une classe doit être créer automatiquement à l'aide de ce JSON.
            Et non, ça ne m'aide pas, mais merci d'avoir cherché !

            • Partager sur Facebook
            • Partager sur Twitter
              25 mai 2017 à 21:09:10

              Définir des classes de façon dynamique ? Je ne vois vraiment pas l'interêt et d'un point de vue design ça me semble absurde.
              Il n'y a pas de raison de créer dynamiquement des classes si celle-ci n'ont pas de méthodes spécifiques, sinon c'est juste un conteneur de données et dans ce cas autant parser le JSON et utiliser un objet javascript classique {}.
              Pour moi c'est beaucoup plus censé de définir statiquement une classe par type d'objet (hérité d'une classe base commune si besoin)

              -
              Edité par MarlburroW 26 mai 2017 à 15:05:41

              • Partager sur Facebook
              • Partager sur Twitter
                26 mai 2017 à 10:14:18

                Je ne sais pas si vous faîtes exprès de ne pas comprendre ou de ne simplement pas vouloir répondre à la question posée.

                Si je vous dis que j'ai besoin de faire ça, j'ai mes raisons, je vous remercie d'avoir voulu m'aider mais je pense me débrouiller seul comme j'ai toujours fais du coup.

                Merci!

                -
                Edité par Sapuraizu 26 mai 2017 à 11:12:13

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  26 mai 2017 à 10:19:26

                  > j'ai mes raisons

                  Qu'on aimerait bien connaître du coup : générer des modèles d'objets dynamiquement ne se fait pas "tout seul" en JS, pour le vouloir quand même, il faut être confronté à un sacré défi !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 mai 2017 à 11:15:02

                    Ce serait bien trop long à éxpliquer, mais voici un exemple de ce que je recherche : http://json2csharp.com/ mais au lieu d'une class C#, une en ES6 ou TypeScript.

                    {
                        "name": "Sapuraizu",
                        "hobbies": ["Development", "Sport"],
                        "isFemale": false,
                        "bankAccount": 154154
                    }

                    Vous pouvez tester le site avec le JSON ci-dessus.

                    EDIT: Du coup, j'ai trouvé ce que je voulais mais en TypeScript (http://json2ts.com/), faut que je me renseigne à propos de ça car j'ai encore jamais utilisé le TypeSript.

                    -
                    Edité par Sapuraizu 26 mai 2017 à 11:19:05

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      26 mai 2017 à 11:29:09

                      À moins que je n'ai loupé quelque chose, on en revient à coder la classe dans une string.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 mai 2017 à 11:36:21

                        J'ai peut-être moi même mal compris quelque chose, tu pourrais m'expliquer ce que t'entends par "coder la classe dans une string" ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          26 mai 2017 à 12:20:46

                          Du code qui génère du code :

                          // Input data, supposedly obtained from a `JSON.parse()` call.
                          let jsonData = {
                                    name: 'Sapuraizu',
                                 hobbies: [ 'Development', 'Sport' ],
                                isFemale: false,
                             bankAccount: 154154
                          }
                          
                          // The output code. That would be a class defining a model
                          // fitted by input data.
                          let classCode
                          
                          /**
                           * @note Depth is currently 1.
                           * @param {String} className
                           * @param {Object} data
                           * @return {String}
                           */
                          function createClassFromData(className, data) {
                             let code = 'class ' + className + ' {\n' // Open the class.
                          
                             // Now the constructor, with its parameters:
                             code += '   constructor(' + Object.keys(data).join(', ') + ') {\n'
                          
                             for (let attr in data) {
                                code += '     this.' + attr + ' = ' + defaultValue(typeof data[attr])
                                code += '\n'
                             }
                          
                             code += '   }\n' // Close the constructor.
                             code += '}\n' // Close the class itself.
                          
                             return code
                          }
                          
                          /**
                           * @param {String} typeName
                           * @return {String}
                           */
                          function defaultValue(typeName) {
                             switch (typeName) {
                                case    'number': return '0'
                                case    'string': return '""'
                                case   'boolean': return 'false'
                                case    'object': return '{}'
                                case 'undefined': return 'null'
                             }
                          }
                          
                          // Generate this model, sergeant!
                          classCode = createClassFromData('Person', jsonData)
                          
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 mai 2017 à 12:25:18

                            Ah oui d'accord, c'est ce que je voulais éviter au départ, si y avais d'autres moyens "plus propres", mais je pense m'orienter vers ça du coup!

                            Merci de ton aide! :)

                            -
                            Edité par Sapuraizu 26 mai 2017 à 12:27:29

                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 mai 2017 à 13:00:48

                              Content que tu ai trouvé  une solution à ton problème.

                              Cependant j'aurais bien aimé connaître la raison de l'utilisation de ce genre de méthode.

                              Peut-être que tu développe un outil de développement type scaffolding/generator un peu comme Yeoman. Dans ce cas ça peu se comprendre.

                              Mais dans le cas ou c'est une "vrai" application (et non un outil de développement) ça me parait complètement "anti-patternesque" de déclarer des classes dynamiquement pendant le runtime. Tu as forcement fait une grosse erreur de design pour en arriver à être obligé de faire ça.

                              ça aurait été intéressant d'en discuter pour faire mieux la prochaine fois.

                              Bon courage

                              -
                              Edité par MarlburroW 26 mai 2017 à 13:15:01

                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 mai 2017 à 13:22:22

                                Je préfère garder toutes les informations sur mon projet, privé pour un certain temps, en tout cas ne t'en fais pas je suis sur et certains de n'avoir fais aucune erreur et ce que j'ai demandé sur ce topic est simplement pour mon utilisation personnelle pour me simplifier le développement.

                                (C'est peut-être un peu dur à comprendre sans avoir le projet sous la main, mais je t'assure que tout va bien :P)

                                Merci de m'avoir donné la solution!

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 mai 2017 à 14:02:07

                                  Ok, 

                                  Mais si tu veux vraiment utiliser cette méthode je me permet un petit conseil:

                                  La méthode de Novax ne fait que générer du code sous la forme d'une string. Si tu veux utiliser ces classes au runtime, Il faudra à un moment ou un autre les passer dans un eval (babelizé en plus) et je pense que c'est "unsafe" et que c'est une mauvaise pratique.

                                  ES6 intègre pas mal d'outil de meta-programming qui permettent de faire ce genre de choses de façon plus "propre" comme les Proxies (cité plus haut par Novax d'ailleur).

                                  Ici une personne a un besoin similaire au tiens et solvé par Proxy: https://stackoverflow.com/questions/34655616/create-an-instance-of-a-class-in-es6-with-a-dynamic-name

                                  On est d'accord c'est pas exactement le même besoin, mais ça doit pouvoir répondre à ton besoin aussi.

                                  Bon courage

                                  -
                                  Edité par MarlburroW 26 mai 2017 à 14:05:49

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Class ES6 depuis données JSON

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown