记一次踩坑|空table应该编码为数组还是对象

栏目: C · 发布时间: 6年前

内容简介:记一次踩坑|空table应该编码为数组还是对象

Json 有两种比较常用的数据类型:被 {} 包裹的对象( object ),被 [] 包裹的数组( array

问题描述

从第三方 API 返回的 json 数据,存在一个 key 的值为空数组,可是经过 decodeencode 这两步操作后,这个 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":[]}

使用 metatabletable 标记为 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应该编码为数组还是对象》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

亚马逊跨境电商运营宝典

亚马逊跨境电商运营宝典

老魏 / 电子工业出版社 / 2018-6 / 69

《亚马逊跨境电商运营宝典》详细讲解亚马逊的平台知识和运营技巧,内容围绕亚马逊卖家的日常工作,系统讲解亚马逊账号注册、后台操作、选品、产品发布、Listing 优化、站内广告、FBA 发货、VAT 税务等内容,并且通过大量的案例分析,用生动翔实的案例为读者传递运营中必备的操作技巧和运营方法。 《亚马逊跨境电商运营宝典》内容针对性强,讲解的知识、技巧和方法都充分考虑到易学、易懂、易操作、易落地执......一起来看看 《亚马逊跨境电商运营宝典》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具