将Lua数据转换为JSON。

这个 EPGP World of Warcraft 插件 会输出一个叫 epgp.lua 的数据库文件。

我写了一个 插件 来将 Lua 数据转换成 JSON 对象,以在公会网站上显示。它在旧版本的插件中可以工作,但现在我想让它正确地转换这个文件,但遇到了一些问题。这里有两个示例显示了转换问题-请查看 此演示

第一个示例能够很好地形成一个嵌套数组:

["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:')     // 将 = 更改为冒号并删除外部括号
    .replace(/[\t\r\n]/g,'')              // 删除制表符和回车
    .replace(/\}\,\s--\s\[\d+\]\}/g,']]') // 用方括号替换以注释结尾的集合
    .replace(/\,\s--\s\[\d+\]/g,',')      // 删除关闭子组和注释
    .replace(/,(\}|\])/g,'$1')            // 删除尾随逗号
    .replace(/\}\,\{/g,'],[')             // 用方括号替换大括号集合
    .replace(/\{\{/g,'[[')                // 将双花括号更改为方括号
    .replace(/EPGP_DB\s\=/,'');

因此,我需要一些帮助来使 Lua 在对象数组(第二个示例)中正确转换。

点赞
用户221509
用户221509

一般情况下,你不能只用字符串操作就将Lua表格转换为JSON数据。问题在于,虽然Lua将表格用于数组和字典,但JSON需要两种不同的类型。还有其他的语法差异。

这可以通过一个模块来解决,该模块可以在Lua和JSON之间进行转换。请查看Lua wiki上的JSON模块,找到一个将Lua转换为JSON的Lua模块。有多个模块可供选择,其中一些是纯Lua,非常适合嵌入到魔兽世界中。它们可以正确地检测表格是否表示为数组或字典,并输出相应的JSON。

2013-04-28 08:52:08
用户1847592
用户1847592

// 将 EPGP_DB 从 LUA 格式转化为 JSON 格式 var str = document.getElementsByTagName('data')[0].innerHTML; var diff; do { // 用方括号替换数组周围的花括号 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/, '') // 移除变量定义 .replace(/\s--\s[\d+](\n)/g, '$1') // 移除注释 .replace(/,(\n\t})/g, '$1') // 移除末尾逗号 .replace(/[(.*?)]\s=\s/g,'$1:') // 将等号改为冒号, 移除括号 .replace(/[\t\r\n]/g,''); // 移除制表符和回车符 console.log(str); json = window.JSON.parse(str); console.log(json); document.getElementById('result').innerText = json.global.last_version;

2013-04-28 13:22:54