内容简介:记一次踩坑|空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应该编码为数组还是对象》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Mechanics of Web Handling
David R. Roisum
This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!