背景
解析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://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://www.kyne.com.au/~mark/software/lua-cjson-manual.html#_decode
来源:oschina
链接:https://my.oschina.net/csp277/blog/4298681