1
votes

Existe-t-il un moyen propre de convertir une table lua (sous forme de chaîne) en un tableau javascript? (et vice versa)

EDIT: prenez une table lua sous forme de chaîne et utilisez javascript pour la convertir en tableau javascript. Pas de programmation dans lua.

Donc, une table lua est juste un tableau associatif dans un format différent.

    --LUA TABLE EXAMPLE
    {
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }

J'ai cherché des fonctions ou bibliothèques javascript à faire ceci bien que je n'ai rencontré que quelques bibliothèques lua pour convertir json en table lua. La table lua sera toujours dans une chaîne. Existe-t-il un moyen de faire cela?


2 commentaires

Copie possible de Convertir une chaîne JSON en table Lua?


@VLAZ non j'ai déjà lu celui-là, je cherche à convertir en utilisant JAVASCRIPT.


3 Réponses :


1
votes

Vous pouvez le faire manuellement pour en faire un JSON valide, puis l'analyser:

const luaStr = `{
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }}`;

const result = luaStr  
  .replace(/\[|\]/g, '') // remove the brackets
  .replace(/=/g, ':') // replace the = with :
  .replace(/(\,)(?=\s*})/g, ''); // remove trailing commas
  
const parsed = JSON.parse(result);

console.log(result);


5 commentaires

Que se passe-t-il si l'espace blanc est au milieu d'une chaîne? '


@ScottSauyet oh, je n'ai pas vu ça, je les ai supprimés pour faciliter la suppression des virgules de fin, je vais repenser cela


Je l'ai seulement remarqué parce que je travaillais sur une solution un peu similaire (maintenant une réponse) qui a un mode d'échec différent dans une chaîne!


@ScottSauyet j'ai mis à jour ma réponse, et oui, la vôtre a l'air bien, mais je suppose qu'il sera toujours difficile si la chaîne avait une valeur comme "aaa",} pour une raison quelconque ..


Oui, je pense que toute solution basée sur les regex va avoir de tels problèmes. Cela nécessite en fait un analyseur approprié. Je pense que le mien a un mode d'échec moins probable que cette réponse, mais rien de tel ne résoudra le cas général.



0
votes

Voici quelque chose que vous ne savez peut-être pas, {["someString"]: 2} est un javascript valide et évaluera à {someString: 2} qui est valide json. Le seul problème est qu'il doit être évalué, ce qui signifie utiliser eval (ce que vous ne devriez vraiment jamais, si vous pouvez l'éviter).

const luaStr = `{
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }}`;
    
const jsonString = luaStr.replace(/\] = /g, ']: ');
const jsonObj = eval(`(${jsonString})`);

console.log(jsonObj);


0 commentaires

1
votes

Ce n'est qu'une solution partielle. Il peut échouer dans certains cas où le texte à l'intérieur d'une chaîne correspond à la syntaxe de la clé. Mais cela ne vous préoccupe peut-être pas.

const lua = `
{
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }
}`

const lua2json = lua => 
  JSON .parse (lua .replace (
    /\[([^\[\]]+)\]\s*=/g, 
    (s, k) => `${k} :`
  ) 
  .replace (/,(\s*)\}/gm, (s, k) => `${k}}`))

console .log (
  lua2json (lua)
)

Je ne savais pas si vous cherchiez à créer JSON ou un objet. J'ai choisi ce dernier, mais vous pouvez toujours supprimer le wrapper JSON.parse .


2 commentaires

Ne serait-il pas préférable d'inclure également des guillemets doubles dans les expressions rationnelles? Supposons que cela fasse partie de la syntaxe et puisse donner une meilleure fiabilité (?)


@Tom: Très probablement. Le problème est que cette technique est intrinsèquement fragile. Toute solution basée sur des expressions régulières aura presque certainement des modes d'échec, donc la question est de savoir si vous voulez utiliser un analyseur à part entière (je recommande vraiment Peg.js ) et sinon, quels compromis faites-vous. Comme il semble que les guillemets soient une syntaxe requise pour Lua (est-ce vrai?), Et que je me concentrais uniquement sur l'interprétation d'une chaîne de table Lua bien formée, je ne m'en souciais pas. Mais cela pourrait aider à attraper des contributions mal formées.