Bonjour à tous. Ce n'est un secret pour personne que l'utilisation de json dans vos projets sur le SDK Corona peut rendre certaines choses très pratiques. J'ai trouvé une anomalie intéressante en travaillant avec la bibliothèque, dont la pratique a montré qu'il ne s'agit pas du tout d'une erreur, mais plutôt d'une fonctionnalité que vous devez connaître et pour laquelle vous devez vous préparer. Examinons tout en détail.
1. Description du problème
Supposons que nous ayons un tableau Lua qui ressemble à ceci:
ar = {23,45,56,'weer'}
Si vous avez tout normal avec une compréhension de la langue, ce tableau vous est présenté comme indiqué ci-dessous, juste faible en gras en raison des circonstances - SI POSSIBLE:
ar = {[1] = 23,[2] = 45,[3] = 56,[4] = 'weer'}
Si vous décidez de convertir ce tableau en json, la sortie vous donnera quelque chose comme ça (bien sûr, nous n'oublierons pas de connecter la bibliothèque json):
ar = {[1] = 23,[2] = 45,[3] = 56,[4] = 'weer'} json = require "json" local str = json.encode(ar) print(str)
Comme vous pouvez le voir, json connaît également l'existence de ce type d'enregistrement simplifié, dans lequel si les éléments du tableau vont séquentiellement, ils ne seront pas explicitement numérotés, ce qui est merveilleux car nous utilisons souvent json dans nos projets pour le protocole réseau ou pour l'enregistrement dans un fichier, et la taille supplémentaire est complètement inexistante à quoi.
Essayons maintenant de reconvertir le drain en une table Lua et d'afficher son contenu, tout en faisant attention aux types de données des clés:
local str = '[23,45,56,"weer"]' local ar2 = json.decode(str) for k,v in pairs(ar2)do print(k,type(k),v) end
Comme vous pouvez le voir, le résultat est plus que prévu, la table ar en entrée correspond entièrement à la table ar2 en sortie. Maintenant, en suivant les 2 points précédents, mais en même temps, il y aura un tableau dans lequel il y a une séquence interrompue dans le tableau, disons que nous ajoutons la clé 6 (en contournant 5) avec la valeur 'wtf'. Nous cassons.
json = require "json" ar = {23,45,56,'weer',[6] = 'wtf'} local str = json.encode(ar) print(str)
Comme vous pouvez le voir, tout s'est à nouveau bien passé, car json.encode s'attendait à cette capture et au lieu d'une clé 5 inexistante insérée nulle et tout cela s'est terminé avec succès, nous ne nous arrêterons pas là et ajouterons une autre clé 777 avec une valeur de 1 au tableau, très probablement nous nous attendons que la table est convertie de la même manière et inclura 770 null - ce n'est certainement pas la meilleure option car elle prendra beaucoup plus d'espace, mais il n'y a tout simplement pas d'autre moyen en json pour créer un analogue complet de cette table lua puisque la clé n'est pas en json peut être clairement vlen comme un nombre. Nous regardons ce qui s'est passé.
json = require "json" ar = {23,45,56,'weer',[6] = 'wtf',[777] = 1} local str = json.encode(ar) print(str)
Comme vous pouvez le voir, l'encodeur est allé dans l'autre sens et a converti toutes les clés avec le numéro de type de valeur en chaîne. Ce n'est pas un secret qu'une telle fonctionnalité peut et conduira à des erreurs (si vous ne le savez pas), ou à des béquilles utilisant des transformations explicites de tonumber / tostring lorsque vous travaillez avec cette table, en tout cas, cela ne fera pas beaucoup de plaisir. Considérez comment y faire face.
2. résoudre le problème
Afin de résoudre ce problème, vous pouvez écrire une fonction qui initialisera tous les tableaux dans lesquels le problème est survenu, puis dans le code, vous devrez constamment vous souvenir de ce problème et appliquer cette fonction partout, c'est une manière normale, mais pas la meilleure, et donc il y a le plan B Redéfinissez l'implémentation de la fonction json.decode afin que toutes les zones problématiques soient automatiquement converties et cette solution fonctionnera à la fois sur la première imbrication dans le tableau passé et sur les pièces jointes plus profondes. Nous allons redéfinir la valeur de la fonction juste après avoir connecté la bibliothèque json au projet. L'implémentation suivante est disponible:
json = require "json" local jd = json.decode
Essayez à nouveau d'effectuer l'opération précédente:
ar = {23,45,56,'weer',[6] = 'wtf',[777] = 1} local str = json.encode(ar) print(str)
Comme vous pouvez le voir, tout a fonctionné et le tableau a conservé son ancienne structure. Enfin, je veux ajouter que si pour une raison quelconque vous devez éviter cette conversion, la nouvelle option d'implémentation json.decode prend en charge un deuxième paramètre facultatif qui désactivera la conversion.
Salut tout le monde!