记一次踩坑|空table应该编码为数组还是对象
来源:互联网 发布:腾讯红包大数据,归属地 编辑:程序博客网 时间:2024/06/05 21:14
Json
有两种比较常用的数据类型:被{}
包裹的对象(object
),被[]
包裹的数组(array
)
问题描述
从第三方API
返回的json
数据,存在一个key
的值为空数组,可是经过decode
和encode
这两步操作后,这个key
的值就变为空对象了:
local cjson = require('cjson')local raw = {}raw.name = 'answer'raw.list = {}local str = cjson.encode(raw)print('after cjson encode:', str)
输出:
after cjson encode: {"name":"answer","list":{}}
cjson
对于空的table
,会默认处理为object
,对于Lua
本身,是无法区分空数组和空字典的(数组和字典融合到一起了),但是对于强类型语言(C/C++, Java
等),这时候就会出现问题,必须作容错处理
解决方法
使用encode_empty_table_as_object
方法
local cjson = require('cjson')local raw = {}raw.name = 'answer'raw.list = {}cjson.encode_empty_table_as_object(false)local str = cjson.encode(raw)print('after cjson encode:', str)
输出:
after cjson encode: {"name":"answer","list":[]}
更换dkjson
库
local dkjson = require('dkjson')local raw = {}raw.name = 'answer'raw.list = {}local str = dkjson.encode(raw)print('after cjson encode:', str)
输出:
after cjson encode: {"name":"answer","list":[]}
使用metatable
将table
标记为array
local cjson = require('cjson')local raw = {}raw.name = 'answer'raw.list = {}setmetatable(raw.list, cjson.empty_array_mt)local str = cjson.encode(raw)print('after cjson encode:', str)
输出:
after cjson encode: {"name":"answer","list":[]}
Reference
- 编码为 array 还是 object
- 使用lua CJSON库如何将空table编码成数组
- openresty/lua-cjson
About me
- GitHub:AnSwErYWJ
- Blog:http://www.answerywj.com
- Email:yuanweijie1993@gmail.com
- Weibo:@AnSwEr不是答案
- CSDN:AnSwEr不是答案的专栏
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
阅读全文
0 0
- 记一次踩坑|空table应该编码为数组还是对象
- 方法应该返回空对象还是null
- 方法应该返回空对象还是null
- 对象为空&&数组包含
- 【数组】判断数组为空还是长度为0好?
- 【java】方法应该返回空对象还是null
- json_encode() 转换空数组为对象输入
- js 判断数组 对象 为空
- 数组自定义排序,判断对象是否为空!
- 判断数组为空
- $_FILES 数组为空
- 判断对象为空
- java 判断对象是否为空或者传入集合对象的是否为空,以及判断数组的长度
- nil是空对象还是 null是空对象?
- js判断table是否为空
- table td为空,没有边框
- lua table是否为空的判断
- 【lua】table是否为空的判断
- CSS Grid布局(3)
- 1009. Product of Polynomials (25)
- 自定义View总结(一)
- 自顶向下深入分析Netty(八)--CodecHandler
- 如何去掉debug是讨厌的错误提示对话框
- 记一次踩坑|空table应该编码为数组还是对象
- day03 LED灯源程序编写与编译、UART原理
- day05 UART实战、源码阅读工具(Sourceinsight/Ctags)、Makefile编写
- day04 UART协议
- 高效能人士的七个习惯总结
- Java去除一个Map中value值最小的K个记录
- 高PowerSurfacing RE v2.4-4.1 for SolidWorks 2012-2017 Win64 6CD
- C/C++ pthread_cond_timedwait()函数使用心得
- day06 链接脚本、shell程序优化、IIC总线