2013-04-27 11 views
5

Ten plik EPGP World of Warcraft addon wysyła plik bazy danych epgp.lua.Konwertuj dane Lua na JSON

Napisałem plugin, aby przekonwertować dane Lua na obiekt JSON do wyświetlenia na stronie gildii. Pracował w starszych wersjach dodatku, ale teraz mam problem z próbą przekonwertowania pliku. Oto dwa fragmenty pokazujące problem z konwersją - patrz this demo.

Pierwsze działa świetnie na utworzenie zagnieżdżonych tablicy:

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

staje

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

Ale zamiennik ciąg widzi to kolejny fragment jako zagnieżdżonej tablicy kiedy powinien on być przedmiotem wewnątrz z tablica:

["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] 
}, 

się

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

Oto skrypt konwersji łańcuchów znaków, który działa tylko w pierwszym fragmencie.

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

Potrzebuję pomocy w poprawieniu konwersji Lua na szereg obiektów (drugi przykład).

+0

Jak wygenerowano [epgp.lua] (https://github.com/Mottie/epgp/blob/master/epgp.lua)? Jeśli jest to kod lua generujący to wyjście, możesz edytować ten kod i korzystać z biblioteki/modułu LuaJSON. – hjpotter92

+0

Jest generowany przez dodatek po wylogowaniu się z gry World of Warcraft. Wystarczy, że prześlesz nieprzetworzony plik danych do swojej witryny. – Mottie

+0

To z powodu twoich "zamień zestawy kończące się komentarzem za pomocą nawiasów kwadratowych" i "zmień podwójne nawiasy na nawiasy kwadratowe". Podwójne curlies nie są konieczne średnia tablica wewnątrz tablicy. Obiekt wewnątrz tablicy to także podwójne loki w Lua. –

Odpowiedz

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 Dobra odpowiedź, ale niestety działa w pakiecie webowym, ale nie w Firefoksie: http://jsfiddle.net/Mottie/MfncJ/4/ (przy użyciu pełnego pliku epgp.lua) - czy to możliwe, że Firefox nie obsługuje zgodnego przechwytywania grupy? – Mottie

+0

@Mottie - Ten ciąg jest zbyt długi dla operacji wyrażeń regularnych. –

+0

@Mottie - Lub zbyt długo, aby JSON mógł je przeanalizować. –

7

Zazwyczaj nie można przekonwertować żadnej tabeli Lua na dane JSON za pomocą operacji na ciągach. Problem polega na tym, że podczas gdy Lua używa tabel zarówno dla tablic, jak i słowników, JSON potrzebuje dwóch różnych typów. Istnieją inne różnice składniowe.

Najlepiej jest to rozwiązać przez moduł, który konwertuje pomiędzy reprezentacją Lua i JSON. Spójrz na Lua wiki on JSON modules i znajdź moduł Lua, aby przekonwertować Lua do JSON. Istnieje wiele modułów, z których niektóre są czystym Lua, będąc dobrym wyborem do osadzenia w WoW. Poprawnie wykrywają, czy tablica reprezentuje tablicę lub słownik i wyprowadza odpowiedni JSON.

+2

+1 za szturchnięcie we właściwym kierunku. Jeśli konsument danych potrzebuje JSON, ale masz tabelę Lua, właściwą odpowiedzią jest wygenerowanie JSON w pierwszej kolejności z kodu Lua, zamiast próby wymiany tekstu, która może się powieść tylko wtedy, gdy użyto pełnego parsera Lua. Co naprawdę oznacza, że ​​Lua ma napisać wynik JSON, i jest to rozwiązany problem. – RBerteig