8

このEPGP World of Warcraft アドオンは、epgp.lua データベース ファイルを出力します。

ギルドの Web サイトで表示するために、Lua データを JSON オブジェクトに変換するプラグインを作成しました。アドオンの古いバージョンでは機能していましたが、ファイルを適切に変換するのに苦労しています。変換の問題を示す 2 つのスニペットを次に示します。このデモを参照してください。

最初のものは、ネストされた配列を形成するのにうまく機能します:

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

しかし、文字列の置換では、次のスニペットが配列内のオブジェクトである必要がある場合に、ネストされた配列として認識されます。

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

最初のスニペットでのみ機能する文字列変換スクリプトを次に示します。

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

そのため、Lua がオブジェクトの配列を適切に変換できるようにするための助けが必要です (2 番目の例)。

4

2 に答える 2

10

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

これは、Lua と JSON 表現の間で変換するモジュールによって最もよく解決されます。JSON モジュールに関する Lua wiki を見て、 Luaを JSON に変換する Lua モジュールを見つけてください。複数のモジュールがあり、一部は純粋な Lua であり、WoW に組み込むのに適しています。テーブルが配列またはディクショナリを表しているかどうかを正しく検出し、関連する JSON を出力します。

于 2013-04-28T08:52:08.280 に答える