Javascript 将Lua数据转换为JSON

Javascript 将Lua数据转换为JSON,javascript,replace,lua,world-of-warcraft,Javascript,Replace,Lua,World Of Warcraft,这将输出一个epgp.lua数据库文件 我编写了一个脚本,将Lua数据转换为JSON对象,以便在工会网站上显示。它在较旧版本的插件中工作,但现在我很难让它正确地转换文件。下面是显示转换问题的两个代码段-请参阅 第一种方法非常适合形成嵌套数组: ["roster_info"] = { { "Agantica", -- [1] "ROGUE", -- [2] "09/03-2013", -- [3] }, -- [1] {

这将输出一个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"
    ],
    [
        "player": "Lîutasila",
        "coinsLeft": "-1",
        "timestamp": "2013-03-07 13:47:00"
    ]
]
但是字符串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]
},
变成

"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"
    ],
    [
        "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能够正确地使用对象数组进行转换(第二个示例)。

通常不能简单地使用字符串操作将任何Lua表转换为JSON数据。问题在于,虽然Lua对数组和字典都使用表,但JSON需要两种不同的类型。还有其他句法上的差异

这最好由一个模块来解决,该模块在Lua和JSON表示之间进行转换。查看并找到一个Lua模块来将Lua转换为JSON。有多个模块,其中一些是纯Lua,是嵌入WoW的好选择。它们正确地检测表是否表示数组或字典,并输出相关的JSON。

//将EPGP_DB从LUA转换为JSON
var str=document.getElementsByTagName('data')[0].innerHTML;
var-diff;
是否用方括号替换数组周围的卷曲
diff=str.length;
str=str.replace(/\{(((\n\t*)\t)\S.*(\2.*)\)\,\S--\S\[\d+\]\3\}/g,[$1$3]';
diff=diff-str.length;
}而(差异>0);
str=str
.replace(/EPGP\u DB\s=\s/,“”)//删除变量定义
.replace(/\s--\s\[\d+\](\n)/g,'$1')//删除注释
.replace(/\,(\n\t*\})/g,'$1')//删除尾部逗号
.replace(/\[(.*?\]\s\=\s/g,$1:')//更改为冒号,删除括号
.替换(/[\t\r\n]/g',);//删除选项卡和返回
console.log(str);
json=window.json.parse(str);
log(json);
document.getElementById('result').innerText=json.global.last_version;

如何生成数据?如果是lua代码生成此输出,您可以编辑该代码并使用LuaJSON库/模块。它是在您注销魔兽世界时由插件生成的。你要做的就是将原始数据文件上传到你的站点。这是因为你的
替换了以方括号结尾的注释集,并且
将双卷曲更改为方括号。双卷曲不是数组内部的平均数组所必需的。数组中的对象也是Lua中的双卷曲。@EgorSkriptunoff请用您描述的内容更新演示。我遇到的问题是将对象与数组中的数组区分开来,或者可能有一个我没有想到的更好的方法?+1回答不错,但遗憾的是它在webkit中有效,但在Firefox中无效:(使用完整的epgp.lua文件)-可能是Firefox不支持匹配的捕获组吗?@Mottie-这个字符串对于正则表达式操作来说太长了。@Mottie-或者对于JSON来说太长了,无法解析。@Mottie-IMO,我的代码是正确的。问题出在JavaScript方面。我不知道怎么解决它。是否可以用Lua而不是JavaScript重写Lua->JSON转换器?我认为这不是解决这个问题的正确方法。如果您希望将Lua数据转换为JSON,您应该使用一个可用的Lua模块来完成这项工作,而不是依赖正则表达式来完成这项工作。+1表示正确方向的微调。如果数据使用者需要JSON,但您有一个Lua表,正确的答案是首先从Lua代码生成JSON,而不是尝试进行文本替换,只有使用完整的Lua解析器才能成功。这实际上等于让Lua首先编写JSON输出,这是一个已解决的问题。