openrestylua的userdatanull与ngx.null问题总结
背景
解析json的时候发现一个问题,如果字段中包含null值,返回的结果不是nil
而是userdata
类型的ngx.null
分析
- nil是lua中基本数据类型之一,用来表示一个无效值,如果一个变量被设置为nil相当于告知该变量未定义(不存在)一样
- OpenResty 的 Lua 接口还提供了一种特殊的空值,即 ngx.null,用来表示不同于 nil 的“空值”
- json中的value如果是null, 经过cjson.decode以后,该value的类型就是userdata,值是ngx.null , 如果强制转换为字符串,则打印出来的内容是“userdata: null”, 所以decode之后,判断value是否为空的时候,需要和ngx.null比较
测试
-- test_cjson.lua
local cjson = require("cjson")
local cjson_decode = cjson.decode
local cjson_encode = cjson.encode
local aa = "{"cc":null}"
bb = cjson_decode(aa)
print(type(bb.cc))
print(tostring(bb.cc))
输出
userdata
userdata: NULL
参考
https://notes.doublemine.me/2018-01-26-lua%E8%AF%BB%E5%8F%96redis%E6%95%B0%E6%8D%AE%E7%9A%84null%E5%88%A4%E6%96%AD.html
https://segmentfault.com/a/1190000007937895
https://vul-hunters.oschina.io/hunter-blogs/posts/lua-null/
https://legacy.gitbook.com/book/moonbingbing/openresty-best-practices/discussions/40
https://notes.doublemine.me/2018-01-26-lua%E8%AF%BB%E5%8F%96redis%E6%95%B0%E6%8D%AE%E7%9A%84null%E5%88%A4%E6%96%AD.html
https://www.kyne.com.au/~mark/software/lua-cjson-manual.html#_decode
以上是 openrestylua的userdatanull与ngx.null问题总结 的全部内容, 来源链接: utcz.com/z/517024.html