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 PHP Discussion :

Json_decode retourne null


Sujet :

Langage PHP

  1. #21
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par acryline
    je suis un peu perplexe quand je découvre ce genre de syntaxe : <<<BUFFER ... BUFFER; ou <<<REGEX ... REGEX;
    Ce sont les syntaxes Heredoc et Nowdoc.

    Citation Envoyé par acryline
    J’ai essayé les codes proposés, mais j’obtiens des erreurs...
    Lesquelles?


    S'ils ne sont pas "top secret" tu peux mettre un de tes fichiers problématiques zippé en pièce jointe. (comme ça on en aura le cœur net).



    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ~     # délimiteur de pattern (début)
    (?|          # groupe "branch-reset", les groupes de captures de chaque alternative on les mêmes numéros (donc ici 1)
        ' ( [^'\\]* (?: \\. [^'\\]* )* ) ' # on capture le contenu entre simple quote
      |        # alternative (OU)
        ( [^][}{,:\s]+ ) # ou alors toute séquence de caractères qui ne soient pas un espace, une virgule, deux-points, des crochets ou des accolades
    )
    ~ x  # délimiteur de pattern (fin) + modificateur x (tous les espaces non-échappés de la pattern sont ignorés)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  2. #22
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    S'ils ne sont pas "top secret" tu peux mettre un de tes fichiers problématiques zippé en pièce jointe. (comme ça on en aura le cœur net).
    Merci pour les infos, elles me seront bien utiles.

    J'ai mis un fichier compressé directement pris dans les données de la grille ici : https://cogito.no-ip.info/cogito/ima...ADA84F37A1D.gz

    Autrement, en éditant le fichier dans Gedit j'ai vu qu'il commence par <? llsd/notation ?>, ce qui ne s'était pas affichés dans mes pages web ! Donc bien sûr le souci doit venir au moins en partie de là. J'ai essayé d'enlever les caractères du début.
    J'ai toujours un retour NULL.



    Quand j'enregistre le fichier $json corrigé, (c'est à dire la chaîne qui devrait être utilisée dans json_encode ) dans un fichier txt et que je l'affiche dans Bluefish ça me donne ça :




    J'ai aussi utilisé mb_detect_encoding sur la chaîne de données et j'obtiens l'encodage ASCII.


    Voilà où j'en suis pour le moment.

  3. #23
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ok, maintenant on sait à quoi on a à faire: le format est LLSD Notation.

    L'entête et le byte nul à la fin sont les raisons qui mettent en défaut json_decode. Pour les enlever: $input = preg_replace('~\A<\?.*\?>\n|\x00\z~', '', $input);.

    Mais par contre ce n'est pas si simple que le laisse supposer le bricolage de mon premier post. Comme tu peux le voir dans la spécification, la syntaxe de ce format est plus subtile qu'il n'y parait. Par exemple une chaîne de caractères peut être représentée de trois manières différentes:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'chaine1':'une chaine avec des "doubles quotes".',
    'chaine2':"une chaine avec des \"doubles quotes\".",
    'chaine3':s(37)"une chaine avec des "doubles quotes"."

    Si les deux premiers formats ne posent pas de problème, le 3e par contre complique les choses et oblige à écrire un vrai parser pour pouvoir s'en sortir (les doubles quotes ne sont pas échappés et seule la taille de la chaîne entre parenthèses permet d'identifier quel est le quote qui marque la fin de la chaîne. Bien sûr, ça n'a rien d'insurmontable, mais on ne peut pas régler ça d'un coup de pattern.

    Autre chose, je ne pense pas que passer par le format en JSON soit forcément une bonne idée car LLSD Notation comprend plusieurs types de valeurs alors que JSON est trés limité de ce coté là. En passant de l'un à l'autre il y aura perte d'informations sur ces types que JSON ne connait pas (et donc impossible ensuite de faire l'opération inverse, de passer de JSON à LLSD Notation). Le tableau auquel le décodage du json est censé aboutir, n'est peut-être pas non plus de meilleur choix de représentation interne. Manipuler des objets dotés d'un attribut type et organisés dans une arborescence me semble plus adapté.
    Je réfléchis à ça.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #24
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Merci CosmoKnacki

    Effectivement, je pense ne pas avoir les compétences pour aborder le format est LLSD Notation en PHP.

    Je ne sais pas si j'aurai le temps aujourd'hui, si oui je testerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $input = preg_replace('~\A<\?.*\?>\n|\x00\z~', '', $input);.
    Si déjà, j'arrive à afficher des informations claires à propos d'un environnement OpenSim dans une page Web, je serai contente. Je pense me baser sur l'affichage du navigateur 3D. Le but premier est de faciliter le rangement des inventaires.

    Pour ce qui est des commandes sur les "assets" du dossier "fsassets" ( suppression ou changement de dossier, renommer ), je pourrai soit le faire via un script bash en envoyant une commande opensim, soit via la base de données qui contient les métadonnées comme les identifiants des dossiers, des utilisateurs, des dossiers parents, les noms des items... Et cela, sans passer pas la modification des chaînes stockées dans les dossiers.

    Mais, modifier un environnement via la page web serait un plus appréciable. Et, pour cela, il faudrait modifier la chaîne de données. On peut rêver.
    De toute façon je fais des tests sur des copies de dossiers et de base de données. Ça peut casser, ce n'est pas grave.

    Je donne des nouvelles.

  5. #25
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Voilà, ça fonctionne.

    Merci pour les pistes qui m'ont orientée et aménée à vous fournir les bonnes informations et enfin arriver à la solution ! Merci

    Illustration du résultat :



    Suite du projet :
    • mettre en forme les résultats obtenus dans le tableau des paramètres d'environnement,
    • afficher d'autres types d'items (les vêtements par exemple),
    • ajouter des fonctionnalités pour la gestion des items des inventaires :
      • Supprimer un item d'un inventaire,
      • Déplacer un item,
      • Renommer un item ou un dossier,
      • Charger un item

    J'affiche déjà dans une arborescence de dossiers, les textures, les snapshots, les notecards, les scripts, les tableaux des objets 3D, les landmarks, les sons (on peut les écouter), et maintenant les paramètres d'environnement.

    Pour les animations, c'est impossible "anim" est un format propriétaire.

    Pour informer les personnes qui passeraient par là et qui se poseraient des questions à propos d'OpenSimulator, serveur libre de mondes virtuels 3D :




    Bon week-end !

  6. #26
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Je déteste trouver un sujet qui m'intéresse et où la réponse à la question n'est pas donnée à la fin. Alors, je m'y colle.

    Mon problème était de transformer une chaîne de caractères qui ressemblent à du JSON en un tableau de données à l'aide de json_decode. La fonction retournait NULL et json_last_error_msg() retournait JSON_ERROR_SYNTAX.

    Alors, je ne suis pas très fière du code qui répare ma chaîne parce que c'est de la bidouille, mais il marche, je vais le donner ici (même pas honte... bon, un peu quand même ). En plus, les pros, pourront me corriger.


    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
     function reparerJson($json)
     {
             //Fourni par CosmoKnacki pour supprimer les infos du format LLSD Notation.
     	 $json = preg_replace('~\A<\?.*\?>\n|\x00\z~', '', $json);  
     
            /*Il y avait un problème avec le nom de l'item qui peut inclure des caractères  comme  deux points, je pense 
    qu'il faudrait ajouter les autres caractères spéciaux pour JSON */ 
      	 $place = strpos($json,"name");
      	 $nom = substr($json, $place);
      	 $place2 = intval(strpos($nom,","));
      	 $nom = substr($nom, 6,$place2-6);
     	 $modif = str_replace(":"," ",$nom);
     	 $json = str_replace($nom, $modif, $json);
     
             //Là c'est pour ajouter des doubles quotes où il en faut. Quand on n'est pas doué en REGEX ça donne ça :) 
      	 $json = str_replace("'", "\"", $json);
      	 $json = str_replace(",", "\"," , $json);
      	 $json = str_replace(":", ":\"" , $json);
      	 $json = str_replace(":\"[",":[", $json);
      	 $json = str_replace("}\",","\"},", $json);
      	 $json = str_replace("}]\"","\"}]", $json);
      	 $json = str_replace("]\"","\"]", $json);
      	 $json = str_replace("[","[\"", $json);
      	 $json = str_replace("\",","\",\"", $json);
      	 $json = str_replace("\"\"","\"", $json);
      	 $json = str_replace(":[\"{",":[{", $json);
      	 $json = str_replace("\":\"{","\":{", $json);  
     
        return $json;
     }

  7. #27
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je suis en train de faire un Tokenizer pour le format LLSD Notation (bon an mal an avec les maigres spécifications du Wiki) en PHP (>=8.1). Voici le premier jet fonctionnel: (désolé c'est un peu un bloc)
    Code php : 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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    namespace LLSDN\Token;
     
    enum Type: string
    {
        // structural tokens
        case LeftMapDelimiter    = '{';
        case RightMapDelimiter   = '}';
        case LeftArrayDelimiter  = '[';
        case RightArrayDelimiter = ']';
        case ItemSeparator       = ',';
        case PairSeparator       = ':';
     
        // key
        case Name                = '#'; // <-- symbole bidon
     
        // type tokens
        case Undef               = '!';
        case BooleanTrue         = 'true';
        case BooleanFalse        = 'false';
     
        case Integer             = 'i';
        case Real                = 'r';
        case UUID                = 'u';
     
        case String              = 's'; 
        case RawBinary           = 'b';
        case Binary16            = 'b16';        
        case Binary64            = 'b64';
        case URI                 = 'l';
        case Date                = 'd';
     
        public function endsValue(): bool {
            return match($this) {
                Type::RightMapDelimiter, Type::RightArrayDelimiter, Type::ItemSeparator => true,
                default => false
            };
        }
     
        public function isStructural(): bool {
            return match($this) {
                Type::LeftMapDelimiter, Type::RightMapDelimiter,
                Type::LeftArrayDelimiter, Type::RightArrayDelimiter,
                Type::PairSeparator, Type::ItemSeparator => true,
                default => false
            };
        }
    };
     
     
    abstract class AbstractToken
    {
        public ?Type $type;
        public ?string $value;
    }
     
     
    class Token extends AbstractToken
    {
    }
     
     
    class Tokenizer
    {
        protected \Iterator $chunk;
        protected AbstractToken $token;
        protected ?string $onHold = null;
     
        public function __construct(\Iterator | Array $chunks, AbstractToken $token = new Token())
        {
            $this->chunk = is_array($chunks)
                ? new \ArrayIterator($chunks)
                : $chunks;
     
            $this->token = $token;
        }
     
        public function tokenize()
        {
            while($this->chunk->valid()) {
                $chunk = $this->chunk->current();
     
                if (in_array($chunk, ["'", '"', 's'], true)) {
                    $this->onHold = $this->stringContent();
                }
                else {
                    yield from match($chunk) {
                        '{', '}', '[', ']', ',', ':', '!' => $this->noValue(),
                        '0', 'f', 'false', 'F', 'FALSE' => $this->boolean(false),
                        '1', 't', 'true', 'T', 'TRUE' => $this->boolean(true),
                        'b16', 'b64', 'd', 'l' => $this->quoted(),
                        'b' => $this->rawBinary(),
                        'i', 'r', 'u' => $this->simple(),
                    };
                }
     
                $this->skipWS();
            }
        }
     
        protected function noValue()
        {
            $type = Type::from($this->chunk->current());
     
            if ($this->onHold !== null) {
                if ($type->endsValue()) {
                    yield $this->buildToken(Type::String, $this->onHold);
                }
                elseif ($type === Type::PairSeparator) {
                    yield $this->buildToken(Type::Name, $this->onHold);
                }
                $this->onHold = null;
            }
     
            yield $this->buildToken($type);
        } 
     
        protected function simple()
        {
            $type = Type::from($this->chunk->current());
            $this->chunk->next();
            yield $this->buildToken($type, $this->chunk->current());
        }
     
        protected function quoted(): \Generator
        {
            $type = Type::from($this->chunk->current());
     
            $this->chunk->next();
     
            $value = $this->escapedContent();
     
            yield $this->buildToken($type, $value);
        }
     
        protected function boolean($value): \Generator
        {
            yield $value ? $this->buildToken(Type::BooleanTrue, 'true')
                         : $this->buildToken(Type::BooleanFalse, 'false');
        }
     
        protected function RawBinary(): \Generator
        {
            $this->chunk->next();
     
            yield $this->buildToken(Type::RawBinary, $this->sizedContent());
        }
     
        protected function stringContent(): string {
            if (in_array($this->chunk->current(), ["'", '"'], true)) {
                return $this->escapedContent();
            }
            else {
                $this->chunk->next(); // parenthèse ouvrante
                return $this->sizedContent();
            }
        }
     
        protected function escapedContent(): string {
            $delimiter = $this->chunk->current();
            $content = '';
     
            do {
                $escaped = false;
                $this->chunk->next();
     
                if ($this->chunk->current() === '\\') {
                    $escaped = true;
                    $this->chunk->next();
     
                    if ($this->chunk->current() !== $delimiter) {
                        $content .= '\\';
                    }
     
                    $content .= $this->chunk->current();
                }
                elseif ($this->chunk->current() !== $delimiter) {
                    $content .= $this->chunk->current();
                }
     
            } while($this->chunk->current() !== $delimiter || $escaped === true);
     
            return $content;
        }
     
        protected function sizedContent(): string {
     
            $this->chunk->next(); // taille
            $size = (int)$this->chunk->current(); 
            $this->chunk->next(); // parenthèse fermante
            $this->chunk->next(); // délimiteur de début
            $content = '';
     
            while(strlen($content) < $size) {
                $this->chunk->next();
                $content .= $this->chunk->current();
            }
     
            $this->chunk->next(); // délimiteur de fin
     
            return $content;
        }
     
        protected function skipWS() {
            $this->chunk->next();
            if ($this->chunk->valid() && preg_match('~\A \s+ \z~ux', $this->chunk->current())) {
                $this->chunk->next();
            }
        }
     
        protected function buildToken(Type $tokenType, ?string $value = null): AbstractToken {
            $token = clone $this->token;
            $token->type = $tokenType;
            $token->value = $value;
            return $token;
        } 
    }

    L'idée est de fournir au tokenizer un contenu préalablement découpé aux endroits stratégiques pour qu'il soit en mesure de délivrer des éléments clairement identifiés du fichier source. Ces éléments sont des objets Token avec deux propriétés: le type (entier, réel, chaîne, map, array, UUID ...) et la valeur le cas échéant.

    Pour l'utiliser, on lui fournit le contenu prédécoupé:
    Code php : 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
    $test = file_get_contents('chemin/vers/le/fichier');
     
    // on enlève l'entête et le caractère nul à la fin
    $test = preg_replace('~\A<\?.*\?>\R|\s*\x00\z~', '', $test);
     
    // on découpe
    $pattern = <<<'REGEX'
    ~(?xx)
    (?<chunk>
        [    ] [ ) ( } { : , ! ' " \\    ]
      |       
        [[:<:]]
        ( 
            (   # boolean
                (?<! [ - + . ] )  [ 0 1 ]  (?= [  ] \s , }  ])
              |
                f (alse)? | t (rue)? | F (ALSE)? | T (RUE)?  
              | # binary
                b ( 16 | 64 )?
              | # string, date, URI
                [ s d l ]
            )
            [[:>:]]
          | # integer, real, UUID
            [ i r u ]
        )
      |
        \s+  
    )
    ~un
    REGEX;
     
    $chunks = preg_split(
        pattern: $pattern,
        subject: $test,
        flags: PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
    );
     
    // on instancie Tokenizer qui va fournir un générateur de Tokens
    $myTKZ = new Tokenizer($chunks);
    $tokenGen = $myTKZ->tokenize();

    Ensuite, on peut à partir de ces tokens composer le format souhaité. Par exemple:
    • pour du JSON:
      Code php : 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
      function toJSON(\Iterator $tokens): string {
          $result = '';
       
          foreach ($tokens as $token) {
       
              if ($token->type->isStructural()) {
                  $result .= $token->type->value;
              }
              elseif ($token->type === Type::Name) {
                  $result .= '"' . $token->value . '"';
              }
              elseif ($token->type === Type::Undef) {
                  $result .= 'null';
              }
              elseif (str_starts_with(needle: 'Boolean', haystack: $token->type->name)) {
                  $result .= '{"value":"' . $token->value . '", "type":"Boolean"}';
              }
              else {
                  $result .= '{"value":' 
                          . json_encode($token->value)
                          . ',"type":"'
                          . $token->type->name . '"}';
              }
          }
          return $result;
      }
       
      echo toJSON($tokenGen);
    • ou pour du XML:
      Code php : 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
      function toXML(\Iterator $tokens): string {
       
          $result = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
          $nameAttribute = null;
       
          foreach($tokens as $token) {
              $tagName = null;
       
              if ($token->type === Type::Name) {
                  $nameAttribute = $token->value;
              }
              elseif (in_array($token->type, [Type::ItemSeparator, Type::PairSeparator], true)) {
                  continue;
              }
              else {
                  $tagName = match($token->type) {
                      Type::LeftMapDelimiter, Type::RightMapDelimiter => 'map',
                      Type::LeftArrayDelimiter, Type::RightArrayDelimiter => 'array',
                      Type::BooleanFalse, Type::BooleanTrue => 'boolean',
                      Type::UUID => 'UUID',
                      Type::URI => 'URI',
                      default => strtolower($token->type->name)
                  };
       
                  $result .= '<';
       
                  if (str_starts_with(needle: 'Right', haystack: $token->type->name)) {
                      $result .= '/' . $tagName . '>';
                      continue;
                  }
       
                  $result .= $tagName;
       
                  if ($nameAttribute) {
                      $result .= ' name="' . $nameAttribute . '"';
                      $nameAttribute = null;
                  }
       
                  if ($token->type === Type::Undef) {
                      $result .= '/>';
                      continue;
                  }
       
                  $result .= '>';
       
                  if (str_starts_with(needle: 'Left', haystack: $token->type->name))
                      continue;
       
                  $result .= $token->type === Type::RawBinary
                      ? '<![CDATA[' . strtr($token->value, [']]>' => ']]]]><![CDATA[>']) . ']]>'
                      : htmlspecialchars($token->value, ENT_XML1, 'UTF-8');
       
                  $result .= '</' . $tagName . '>';
              }
          }
          return $result;
      }
       
      echo toXML($tokenGen);


    demo JSON et demo XML.

    L'intérêt est de pouvoir créer sa propre fonction personnalisée afin d'obtenir le format que l'on souhaite. Ici, j'ai pris le partie de ne pas perdre d'informations en conservant une trace du type. Dans la version JSON, une valeur scalaire comme par exemple r1.234 en LLSD Notation devient en JSON un objet {"type":"real", "value":"1.234"}. Donc pas de perte, le type attendu est explicite et le fait de perpétuer la valeur sous forme de chaîne évite les problèmes d'arrondis ou de tailles.
    J'ai composé le XML dans le même esprit, sauf que dans ce cas, c'est le nom de la balise qui détermine le type.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #28
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par acryline Voir le message
    Alors, je ne suis pas très fière du code qui répare ma chaîne parce que c'est de la bidouille, mais il marche...
    Il n'y a pas de quoi, la bidouille peut demander beaucoup d'efforts. Le pain noir c'est bon pour la santé.


    /*Il y avait un problème avec le nom de l'item qui peut inclure des caractères comme deux points,...*/
    C'est bizarre que tu dises ça. Le caractère "deux-points" ne doit pas poser de problème, qu'il soit présent dans une clef ou dans une valeur dés lors que celles-ci sont délimitées. Je ne vois pas trop le problème. Qu'est-ce que tu appelles le "nom de l'item" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
             //Là c'est pour ajouter des doubles quotes où il en faut. Quand on n'est pas doué en REGEX ça donne ça :) 
      	 $json = str_replace("'", "\"", $json);
      	 $json = str_replace(",", "\"," , $json);
      	 $json = str_replace(":", ":\"" , $json);
      	 $json = str_replace(":\"[",":[", $json);
      	 $json = str_replace("}\",","\"},", $json);
      	 $json = str_replace("}]\"","\"}]", $json);
      	 $json = str_replace("]\"","\"]", $json);
      	 $json = str_replace("[","[\"", $json);
      	 $json = str_replace("\",","\",\"", $json);
      	 $json = str_replace("\"\"","\"", $json);
      	 $json = str_replace(":[\"{",":[{", $json);
      	 $json = str_replace("\":\"{","\":{", $json);
    L'effort est louable, mais ça reste dangereux (même si ça semble marcher sur tes tests) pour plusieurs raisons:
    • Le contexte: Tu ne sais pas dans quel contexte se trouvent les caractères que tu remplaces. Par exemple à l'intérieur d'une chaîne: "O'Brian c'est acheté un nouvel alambic, n'est-ce pas?" donnera quelque chose comme ça: "O"Brian c"est acheté un nouvel alambic"," n"est-ce pas?"
    • Les remplacements globaux successifs font que tu marches sur des œufs, c'est à dire qu'arrivé à un moment, tu devras gérer un cas que tu n'avais pas encore vu qui va faire que pour ajouter un ultime remplacement tu vas devoir éditer ceux que tu as fais précédemment. Là il y en a déjà 12, et plus il y en a, plus c'est difficile.
    • Quid des chaînes délimitées par une taille qui sont sous cette forme: s(35)"Barbie: "Allons sauver Barbieland!"" ou du type Binary Raw qui se compose de la même manière: b(23)"10 PRINT "TOTO":GOTO 10"


    PS: pour l'instant je n'ai que trois fichiers pour faire des tests, celui que tu as fourni, et les deux exemples du Wiki LLSD. J'en produis moi-même (avec mes petites mimines) à des fins de tests, mais si tu connais une source de ce type de fichiers sur le web ou si tu veux en fournir d'avantage n'hésites pas.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #29
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Quel travail CosmoKnacki ! Merci.

    Je vais regarder ça de plus près. Ce qui me vient en survolant les deux derniers messages :

    • ce code correspond exactement aux besoins, parce qu'effectivement, le mien ne fonctionne pas toujours et je dois ajouter encore et encore des cas particuliers.
    • je suis allée m'informer pour savoir ce que veux dire tokenizer : Parseur en tokens. Par exemple cela permet de transformer un texte en plusieurs mots séparés par des espaces.
    • je code seulement en procédural, comment inclure de l'objet dans mon code ? Est-ce que je vais savoir utiliser le Tokenizer ? ... Je vais tester.


    C'est bizarre que tu dises ça. Le caractère "deux-points" ne doit pas poser de problème, qu'il soit présent dans une clef ou dans une valeur dés lors que celles-ci sont délimitées. Je ne vois pas trop le problème. Qu'est-ce que tu appelles le "nom de l'item" ?
    Un item pour moi c'est tout objet de l'inventaire de l'utilisateur dans le monde virtuel. Les paramètres de configuration apparaissent dans les inventaires, on peut en créer et les ajouter . Un fichier correspond à un item et dans le fichier il y a le nom de l'item de l'inventaire.
    Chez moi les deux points ne passent pas, mais il n'y a pas que les deux points, l'apostrophe le slash...

    Les remplacements globaux successifs font que tu marches sur des œufs, c'est à dire qu'arrivé à un moment, tu devras gérer un cas que tu n'avais pas encore vu qui va faire que pour ajouter un ultime remplacement tu vas devoir éditer ceux que tu as fais précédemment. Là il y en a déjà 12, et plus il y en a, plus c'est difficile.
    C'est exactement ce qui m'arrive. Comme j'ai testé, je comprends exactement ce que cela signifie.

    Voilà, je m'y mets. Tout d'abord je fais un dossier de fichiers tests. Si je donne le lien des données de la grille j'ai peur pour la sécurité du serveur et en plus tous les types d'items sont mélangés. Une texture, un son, une note, un script etc, ne sont pas du tout gérés de la même façon et pour trouver le type de l'item il faut chercher l'info dans la base de données. Je mets tout ce que je trouve dans le dossier et je les décompresse.

  10. #30
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Voila j'ai rassemblé tous les paramètres d'environnement de mon inventaire (je n'ai pas mis ceux des autres utilisateurs) dans un dossier. Je ne pense pas le laisser ouvert très longtemps. C'est ici

    Ces fichiers ne sont pas décompressés. Parmis ces items il y a des fichiers de configuration pour le ciel, d'autres pour l'eau et d'autres encore pour la journée. Les trois types sont construits sur le même format LLSD Notation0 mais, ils ont diffèrents paramètres.

  11. #31
    Membre régulier Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Je suis en train de faire un Tokenizer pour le format LLSD Notation
    Bonjour,

    j'ai enfin eu le temps de tester le Tokenizer. Je rencontre quelques soucis. J'ai essayé de comprendre le regex... pas simple.


    Sinon, le code me renvoie une erreur sur l'enumération . J'ai mis le Tokenizer dans un fichier php et pour l'utiliser dans le test, j'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require ("<fichier>.php");
    C'est ce qu'il fallait faire ?

    L'erreur que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Parse error: syntax error, unexpected 'Type' (T_STRING)
    Alors, je ne m'y connais pas assez pour avoir la moindre idée de ce qu'il faut faire.

    J'ai aussi créé un compte test sur la grille OpenSimulator pour faire une petite démo et montrer l'état de l'inventaire que j'affiche dans une page web. Les informations présentées sont différentes suivant le type d'item. Il faut cliquer sur les dossiers pour qu'ils s'ouvrent et sur les items pour ouvrir une fenêtre modale d'informations.

    Pour voir les paramètres d'environnement qui nous concernent ici, il faut aller dans le dossier "Settings". J'utilise mon code bidouillé pour afficher les paramètres mais, je sais que ce code ne fonctionne pas correctement. Quand je teste mon inventaire à la place de l'utilisateur test de la démo, beaucoup de paramètres ne s'affichent pas.

    La démo : https://cogito.no-ip.info/cogito/demo/

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Des sites Microsoft indisponibles depuis des heures
    Par Stéphane le calme dans le forum Actualités
    Réponses: 13
    Dernier message: 23/11/2013, 12h15
  2. lien mort depuis des pages qui n'ont pas ce lien
    Par zuger dans le forum Apache
    Réponses: 1
    Dernier message: 27/09/2012, 18h42
  3. Appli visible dans la barre des taches mais ne s’ouvre pas.
    Par Pascal Lob dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 23/10/2010, 11h38
  4. With // Je cherche mais ne trouve pas
    Par cm16 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/05/2007, 20h44

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