2013-04-27 8 views
5

Diese EPGP World of Warcraft addon gibt eine epgp.lua-Datenbankdatei aus.Lua-Daten in JSON konvertieren

Ich schrieb eine plugin, um die Lua-Daten in ein JSON-Objekt zur Anzeige auf einer Gildenwebseite zu konvertieren. Es funktionierte in älteren Versionen des Addons, aber jetzt habe ich Probleme, es zu bekommen, um die Datei richtig zu konvertieren. Hier sind zwei Snippets, die das Konvertierungsproblem zeigen - siehe this demo.

Die ersten Arbeiten groß auf eine verschachtelte Array bilden:

["roster_info"] = { 
    { 
     "Agantica", -- [1] 
     "ROGUE", -- [2] 
     "09/03-2013", -- [3] 
    }, -- [1] 
    { 
     "Intikamim", -- [1] 
     "PALADIN", -- [2] 
     "17/02-2013", -- [3] 
    }, -- [2] 
}, 

wird

"roster_info" : [ 
    [ 
     "Agantica", 
     "ROGUE", 
     "09/03-2013" 
    ], 
    [ 
     "Intikamim", 
     "PALADIN", 
     "17/02-2013" 
    ] 
] 

Aber die Zeichenfolge replacment sieht diesen nächsten Schnipsel als verschachtelten Array, wenn es innerhalb von einem Objekt sein sollte Array:

["bonus_loot_log"] = { 
    { 
     ["player"] = "Magebox", 
     ["timestamp"] = "2013-03-07 13:44:00", 
     ["coinsLeft"] = "-1", 
     ["reward"] = "|cffa335ee|Hitem:86815:0:0:0:0:0:0:632235520:90:0:445|h[Attenuating Bracers]|h|r", 
    }, -- [1] 
      { 
     ["player"] = "Lîutasila", 
     ["coinsLeft"] = "-1", 
     ["timestamp"] = "2013-03-07 13:47:00", 
    }, -- [2] 
}, 

wird

"bonus_loot_log" : [ 
    [ 
     "player" : "Magebox", 
     "timestamp" : "2013-03-07 13:44:00", 
     "coinsLeft" : "-1", 
     "reward" : "|cffa335ee|Hitem:86815:0:0:0:0:0:0:632235520:90:0:445|h[Attenuating Bracers]|h|r" 
    ], 
    [ 
     "player": "Lîutasila", 
     "coinsLeft": "-1", 
     "timestamp": "2013-03-07 13:47:00" 
    ] 
] 

Hier ist das String-Konvertierungsscript, das nur für das erste Snippet funktioniert.

lua_string 
    .replace(/\[(.*)\]\s\=\s/g,'$1:')  // change equal to colon & remove outer brackets 
    .replace(/[\t\r\n]/g,'')    // remove tabs & returns 
    .replace(/\}\,\s--\s\[\d+\]\}/g,']]') // replace sets ending with a comment with square brackets 
    .replace(/\,\s--\s\[\d+\]/g,',')  // remove close subgroup and comment 
    .replace(/,(\}|\])/g,'$1')   // remove trailing comma 
    .replace(/\}\,\{/g,'],[')    // replace curly bracket set with square brackets 
    .replace(/\{\{/g,'[[')    // change double curlies to square brackets 
    .replace(/EPGP_DB\s\=/,''); 

Also, ich brauche etwas Hilfe die Lua immer richtig von Objekten (zweites Beispiel) mit einem Array zu konvertieren.

+0

Wie wird die [epgp.lua] (https://github.com/Mottie/epgp/blob/master/epgp.lua) generiert? Wenn es ein Lua-Code ist, der diese Ausgabe generiert, können Sie diesen Code bearbeiten und die LuaJSON-Bibliothek/das LuaJSON-Modul verwenden. – hjpotter92

+0

Es wird vom Addon generiert, wenn Sie sich von World of Warcraft abmelden. Sie müssen lediglich die Rohdatendatei auf Ihre Site hochladen. – Mottie

+0

Dies ist wegen Ihrer 'ersetze Sätze, die mit einem Kommentar mit eckigen Klammern enden 'und' Ändern Sie doppelte Curlies in eckige Klammern'. Doppelte Curlies sind keine notwendige Anordnung innerhalb der Anordnung. Objekt innerhalb Array ist auch doppelte Curlies in Lua. –

Antwort

1
// convert EPGP_DB from LUA to JSON 
var str = document.getElementsByTagName('data')[0].innerHTML; 
var diff; 
do { // replace curlies around arrays with square brackets 
    diff = str.length; 
    str = str.replace(/\{(((\n\t*)\t)\S.*(\2.*)*)\,\s--\s\[\d+\]\3\}/g,'[$1$3]'); 
    diff = diff - str.length; 
} while (diff > 0); 
str = str 
.replace(/EPGP_DB\s=\s/, '')   // remove variable definition 
.replace(/\s--\s\[\d+\](\n)/g, '$1') // remove comment 
.replace(/\,(\n\t*\})/g, '$1')  // remove trailing comma 
.replace(/\[(.*?)\]\s\=\s/g,'$1:') // change equal to colon, remove brackets 
.replace(/[\t\r\n]/g,'');   // remove tabs & returns 
console.log(str); 
json = window.JSON.parse(str); 
console.log(json); 
document.getElementById('result').innerText = json.global.last_version; 
+0

+1 Schöne Antwort, aber leider funktioniert es in Webkit, aber nicht in Firefox: http://jsfiddle.net/Mottie/MfncJ/4/ (mit voller epgp.lua-Datei) - könnte es sein, dass Firefox keine passende Erfassung unterstützt Gruppen? – Mottie

+0

@Mottie - Diese Zeichenfolge ist für Regex-Operationen zu lang. –

+0

@Mottie - Oder zu lang für JSON zu parsen. –

7

Sie können im Allgemeinen keine Lua-Tabelle in JSON-Daten konvertieren, indem Sie einfach Zeichenfolgenoperationen verwenden. Das Problem besteht darin, dass Lua zwar Tabellen für Arrays und Wörterbücher verwendet, JSON jedoch zwei verschiedene Typen benötigt. Es gibt andere syntaktische Unterschiede.

Dies wird am besten durch ein Modul gelöst, das zwischen Lua und JSON-Darstellung konvertiert. Werfen Sie einen Blick auf die Lua wiki on JSON modules und finden Sie ein Lua-Modul, um Lua zu JSON zu konvertieren. Es gibt mehrere Module, von denen einige reines Lua sind und eine gute Wahl für das Einbetten in WoW sind. Sie erkennen korrekt, ob eine Tabelle ein Array oder ein Wörterbuch darstellt und geben den relevanten JSON aus.

+2

+1 für den Anstoss in die richtige Richtung. Wenn der Datenkonsument JSON benötigt, Sie aber eine Lua-Tabelle haben, ist die richtige Antwort, JSON in erster Linie aus dem Lua-Code zu erzeugen, anstatt Textersetzungen zu versuchen, die nur erfolgreich sein können, wenn ein vollständiger Lua-Parser verwendet wurde. Was wirklich darin besteht, Lua dazu zu bringen, JSON-Ausgaben zu schreiben, und das ist ein gelöstes Problem. – RBerteig