2013-04-27 35 views
5

このEPGP World of Warcraft addonは、epgp.luaデータベースファイルを出力します。LuaデータをJSONに変換する

私はpluginを書いて、ギルドのウェブサイトに表示するためにLuaデータをJSONオブジェクトに変換しました。古いバージョンのアドオンで動作していましたが、今はファイルを適切に変換しようとするときに問題があります。変換の問題を示す2つのスニペットがあります。this demoを参照してください。

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

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

なるが、それは内部のオブジェクトでなければなりません場合、文字列のreplacmentのは、ネストされた配列としてこの次のスニペットを見ている:ネストされた配列を形成することで素晴らしい

最初の作品配列:

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

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

ここには、最初のスニペットでのみ機能する文字列変換スクリプトがあります。

私は、オブジェクトの配列(2番目の例)を使用してLuaを適切に変換する助けが必要です。

+0

[epgp.lua](https://github.com/Mottie/epgp/blob/master/epgp.lua)はどのように生成されますか?この出力を生成するluaコードの場合、そのコードを編集してLuaJSONライブラリ/モジュールを使用することができます。 – hjpotter92

+0

World of Warcraftからログアウトすると、アドオンによって生成されます。あなたがしているのは、生のデータファイルをあなたのサイトにアップロードすることだけです。 – Mottie

+0

これは、あなたの ''大集合を大括弧で終わるものに置き換え、 ''二重の大括弧を大括弧に変更する」行のためです。二重括弧は配列内の配列を意味する必要はありません。 Array内のオブジェクトもLuaの二重列です。 –

答えて

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素晴らしい答えですが、悲しいことに、WebkitではFirefoxが動作しません:http://jsfiddle.net/Mottie/MfncJ/4/(完全なepgp.luaファイルを使用しています) - Firefoxは一致するキャプチャをサポートしていない可能性がありますグループ? – Mottie

+0

@Mottie - この文字列は正規表現操作には長すぎます。 –

+0

@Mottie - JSONが解析するには時間がかかりすぎます。 –

7

通常、文字列操作を使用するだけで、LuaテーブルをJSONデータに変換することはできません。問題は、Luaが配列と辞書の両方のテーブルを使用するのに対して、JSONは2つの異なるタイプを必要とすることです。構文上の違いもあります。

これは、LuaとJSON表現を変換するモジュールによって最も良く解決されます。 Lua wiki on JSON modulesを見て、LuaをJSONに変換するLuaモジュールを見つけてください。複数のモジュールがありますが、いくつかは純粋なLuaであり、WoWに組み込むのに適しています。テーブルが配列か辞書かを正しく検出し、関連するJSONを出力します。

+2

右方向へのナッジの+1。データコンシューマがJSONを必要としていてもLuaテーブルが必要な場合は、完全なLuaパーサーを使用した場合にのみ成功するテキスト置換を試みるのではなく、最初にLuaコードからJSONを生成することが正しい答えです。実際には、LuaにJSON出力を最初に書き込むことになり、解決された問題です。 – RBerteig