openresty lua的 userdata:null与ngx.null问题总结

久未见 提交于 2020-08-18 08:37:50

背景

解析json的时候发现一个问题,如果字段中包含null值,返回的结果不是nil而是userdata类型的ngx.null

分析

  1. nil是lua中基本数据类型之一,用来表示一个无效值,如果一个变量被设置为nil相当于告知该变量未定义(不存在)一样
  2. OpenResty 的 Lua 接口还提供了一种特殊的空值,即 ngx.null,用来表示不同于 nil 的“空值”
  3. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!