如何在Lua中解析JSON?

3
有没有轻量级的,最好是纯lua语言编写的解析json内容的库?基本上我想要用一个lua模块来扩展我的ngnix,需要从Redis获取一个json对象并验证其中的一些信息。
该对象如下所示:
{
  "data": {
    "user": {
      "username": "username",
      "type": "TYPE"
    }
  },
  "passport": {
    "user": "uuid"
  },
}

在我的lua代码中,我需要验证data.user.username是否存在。然后,我可以让nginx继续进行重定向。请问有人可以给我一个示例,说明我该如何实现这一点吗?

简单的答案就是选择你喜欢的库。有很多库可供选择 :) - moteus
1
[1] http://lua-users.org/wiki/JsonModules这是一个Lua编程语言的JSON模块列表,其中包含了多个可用于解析和生成JSON数据的库。这些库提供了不同的功能和性能特点,可以根据具体需求进行选择。[2] https://github.com/Egor-Skriptunoff/json4luajson4lua是一个用于Lua编程语言的JSON解析器/编码器。它支持标准的JSON格式,并提供了易于使用的API,使得在Lua中处理JSON数据变得更加容易。此外,它还支持自定义类型的编码和解码,以及对Unicode字符的完全支持。 - Egor Skriptunoff
1个回答

5

这种形式的JSON数据非常接近于Lua表。因此,如果您信任该JSON数据,您可以将其转换为Lua代码并运行它。

J=[[
{
  "data": {
    "user": {
      "username": "username",
      "type": "TYPE"
    }
  },
  "passport": {
    "user": "uuid"
  },
}
]]
L="return "..J:gsub('("[^"]-"):','[%1]=')
T=loadstring(L)()
print(T.data.user.username)

如果对JSON数据有任何疑虑,您可能希望在沙盒中运行代码中的字符串L

1
@warspyking 因为在“纯lua”方式中,这几乎肯定是最快的。而且它可以以安全的方式完成。(除非Lua解析器中有一个非常丑陋的错误,但这相当不可能。)此外,例如,对于暴露给未知(并且很可能是一些恶意的)数据的Web API和用于快速加载本地运行的某些其他受信任工具生成的数据的工具之间存在威胁级别的差异(即使该工具与网络接口)。 - nobody
我理解它的作用,但是为了这么简单的事情使用loadstring真的很耗费资源,你不觉得吗? - warspyking
1
@warspyking,我怀疑用纯Lua编写的手写JSON解析器在速度和内存使用方面都不如Lua解析器快,但我还没有进行任何测量。 - lhf
1
这仅适用于JSON的有限子集。即使在此示例中,JSON也无效,但它可以解析而不会出现任何错误。 - moteus
^ 是的,JSON源编码应该得到关注。 - user5066707
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接