菜鸟笔记
提升您的技术认知

json 使用异常之“in json::value::resolvereference(key, end): requires objectvalue”-ag真人游戏

今天在使用json时,出现了一个问题,抛出异常:‘json::logicerror’,如:

异常内容为:要求是对象。最开始的代码是这样的:

list是一个入参,json类型,在structtojson()函数里对list进行赋值,用的是append()函数,在for循环结束后,最后在list里添加一个字段:list["total"] = ncount; 结果就出现了上面的异常,不加这行,运行没有问题。很奇怪这几行代码一开始就是这样写的,运行没有问题,结果改了其他好几个地方,就出现问题了。

经过排查,终于找到问题原因:在经过structtojson()函数后,list已经变成了一个数组类型,可以验证如下,添加一行打印:tracef("list type = %d\n", list.type()); 结果如下:

 

 此时list已经是一个数组了,对数组进行[]操作,所以抛出了一个异常。看json源码:

 

 这里有个断言,是一个宏定义,判断第一个参数如果是假,则抛出异常,然后abort(),而这第一个参数是:type_ == nullvalue || type_ == objectvalue ,即类型是nullvalue或objectvalue都不会断言,不是这两个类型就抛出异常了。从上面打印出来,list已经是一个数组了,所以才导致这个断言。那为什么那几行代码之前也是这样写的,不会出问题呢,因为是我一开始在这个函数structtojson()里是这样写的:

这样写确实是不会有问题,因为result["data"]操作使得result是一个对象,而不是数组。后面改成了result.append(onerecord); 然而函数外仍然有list["total"]这样就出问题了。^_^

 

 

 

网站地图