cjson中的稀疏数组encode

lua中的cjson扩展一直是比较好用的json处理扩展,但是在处理数字索引时对于索引下标不连续的悉数数组确有一些特殊的处理方式。

在默认情况下只要不连续的数量少于10就会被null填补上,但最大索引大于10或最大索引大于数组数量一倍时就会抛出“Cannot serialise table: excessively sparse array”

这是由于cjson处理稀疏数组时有一个安全处理的条件具体可以查看lua-cjson的文档3.11


通过cjson.encode_sparse_array()可以查看到当前的对应配置值
例如,默认情况下:

print(cjson.encode_sparse_array())
输出
false 2 10

这里返回的三个参数分别表示为:极度稀疏数组(excessively sparse array)是否转为字符串索引,最大索引号与元素数量的安全比例,超出安全比例时最大索引值上限。

了解了这些后就可以按需要来设置相关值,比如允许字符串索引时:

cjson.encode_sparse_array(true)
print(cjson.encode({[1000]="data"}))

输出

{"1000":"data"}

而如果将比例设为0:

cjson.encode_sparse_array(false,0)
print(cjson.encode({[11]="data"}))

输出:[null,null,"data"]


正确的设置参数后将避免excessively sparse array异常出现的问题

相关文章

  jsonp需要在页面中添加一个<script>元素,由该元素来从其他服务器加载json数据。 <body&g...
<script> var testApi = "地址"; $.ajax({ url:testApi,//可以不是本地域名 type:‘post...
总是有人会遇到跨域问题,然后有个jsonp的解决方案,MVC中代码如下: public class JsonpResult : Syst...
最近开发中遇到调用第三方web_api的功能,后端在处理json数据时使用fastjson来做反序列化,由于调用api...
JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。jsoncpp...
JsonSerializer有多个属性,用于自定义如何序列化JSON。这些也可以通过JsonSerializerSettings参数,在...