2013-04-27 17 views
5

Questo EPGP World of Warcraft addon emette un file di database epgp.lua.Converti dati Lua in JSON

Ho scritto un plugin per convertire i dati Lua in un oggetto JSON per la visualizzazione su un sito Web della gilda. Funzionava con le versioni precedenti dell'addon, ma ora sto avendo problemi a cercare di convincerlo a convertire il file correttamente. Ecco due snippet che mostrano il problema di conversione: vedi this demo.

I primi lavori grandi a formare un array nidificato:

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

diventa

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

Ma il replacment stringa vede questa seguente ritaglio come una matrice nidificata quando dovrebbe essere un oggetto all'interno di un 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] 
}, 

diventa

"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" 
    ] 
] 

Ecco lo script di conversione stringa che funziona solo sul primo frammento.

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\=/,''); 

Quindi, ho bisogno di aiuto per far sì che la Lua si converta correttamente con una serie di oggetti (secondo esempio).

+0

Come viene generato [epgp.lua] (https://github.com/Mottie/epgp/blob/master/epgp.lua)? Se si tratta di un codice lua che genera questo output, è possibile modificare tale codice e utilizzare la libreria/modulo LuaJSON. – hjpotter92

+0

Viene generato dall'addon quando esci da World of Warcraft. Tutto quello che devi fare è caricare il file di dati grezzi sul tuo sito. – Mottie

+0

Questo a causa delle tue serie di "sostituisci serie che terminano con un commento con parentesi quadre" e "cambia le doppie pieghe a parentesi quadre". I doppi riccioli non sono necessariamente la media dell'array all'interno dell'array. L'oggetto all'interno dell'array è anche un doppio ricciolo in Lua. –

risposta

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 Bella risposta, ma purtroppo funziona nel webkit ma non in Firefox: http://jsfiddle.net/Mottie/MfncJ/4/ (utilizzando il file completo epgp.lua) - potrebbe essere che Firefox non supporti l'acquisizione della corrispondenza gruppi? – Mottie

+0

@Mottie - Questa stringa è troppo lunga per le operazioni di regex. –

+0

@Mottie - O troppo lungo per l'analisi da parte di JSON. –

7

Generalmente non è possibile convertire alcuna tabella Lua in dati JSON semplicemente utilizzando le operazioni con le stringhe. Il problema è che mentre Lua utilizza le tabelle per entrambi gli array e i dizionari, JSON ha bisogno di due tipi diversi. Ci sono altre differenze sintattiche.

Questo è risolto nel modo migliore da un modulo che converte tra rappresentazione Lua e JSON. Dai uno sguardo allo Lua wiki on JSON modules e trova un modulo Lua per convertire Lua in JSON. Ci sono più moduli, alcuni dei quali sono Lua puri, essendo una buona scelta per incorporarli in WoW. Rilevano correttamente se una tabella rappresenta un array o un dizionario ed emette il JSON pertinente.

+2

+1 per la spinta nella giusta direzione. Se il consumatore di dati ha bisogno di JSON, ma si ha una tabella Lua, la risposta corretta è produrre JSON in primo luogo dal codice Lua piuttosto che tentare di sostituire il testo, che può avere successo solo se è stato utilizzato un parser Lua completo. Il che equivale a far sì che Lua scriva l'output JSON in primo luogo ed è un problema risolto. – RBerteig