内容简介:记一次踩坑|空table应该编码为数组还是对象
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":[]}
以上所述就是小编给大家介绍的《记一次踩坑|空table应该编码为数组还是对象》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 算法面试:数组编码面试问题
- 编码、摘要和加密(一)——字节编码
- 新媒体编码时代的技术:编码与传输
- MySQL数据库字符编码总结--数据传输编码
- PHP 开发者学 Golang 之 URL 编码 (Urlencode)、解编码 (Urldecode)
- ios平台实现视频H264硬编码及软编码(附完整demo)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
技术之瞳——阿里巴巴技术笔试心得
阿里巴巴集团校园招聘笔试项目组 / 电子工业出版社 / 2016-11 / 69
《技术之瞳——阿里巴巴技术笔试心得》由阿里巴巴集团校园招聘笔试项目组所著,收集了阿里历年校招中的精华笔试题,涉 及多个领域。《技术之瞳——阿里巴巴技术笔试心得》中内容大量结合了阿里巴巴的实际工作场景,以例题、解析、习题的形式,引 导读者深入理解技术上的关键点、紧要处,夯实基础,启发思考。《技术之瞳——阿里巴巴技术笔试心得》内容不仅专业、有趣,更 是将理论知识与实践应用结合起来,以场景化的问答娓娓道......一起来看看 《技术之瞳——阿里巴巴技术笔试心得》 这本书的介绍吧!