void TestSegFunction(void)
{
int i = 0;
char *str = "\"{\"loop_number\":1}\""; // line 410
char *str = "{\"loop_number\":1}"; // line 411
json_object *pstObj = NULL;
json_object *sonPstObj = NULL;
pstObj = json_tokener_parse(str); // line 414
if (NULL == pstObj)
{
printf("%s : json_tokener_parse failed.\n", __FUNCTION__);
}
else
{
json_object_object_foreach(pstObj, key1, val1)
{
if (0 == strcmp(key1, LOOP_NUMBER))
{
i = json_object_get_int(val1);
printf("i = %d\n", i);
}
}
}
}
如第410和411行所示,如果使用410行代码,则414行函数调用中将出现段错误。如果使用411行代码,则414行中将没有错误,因为此函数被其他人调用,并且它们可能输入错误字符串。我不想看到段错误来停止程序。有什么办法可以避免这种段落错误?
答案 0 :(得分:4)
问题是我要遍历非json_type_object
类型的内容。
我需要添加一张支票
if (json_object_get_type(pstObj) != json_type_object) {
...handle error...
}
在json_object_object_foreach
之前。
答案 1 :(得分:0)
我认为代码行410无效,而411行有效。
char *str = "\"{\"loop_number\":1}\"";
这不是有效的JSON,因为JSON不能以"
开头,所以此代码行实际上在做什么。它为您提供字符串"{"loop_number": 1}}"
。只需使用c的打印功能进行验证。但是JSON可以以{
开头。
char *str = "{\"loop_number\":1}";
为您提供字符串{"loop_number": 1}
(请参见{ }
周围没有“”)。
我希望这会有所帮助。
编辑
随着代码在第414行中断,您可以直接使用json_tokener_parse_ex
。实际上,json_tokener_parse
似乎只是包装json_tokener_parse_ex
。因此,如果您按照documentation和here中的描述直接使用它,则可以解决此问题。但是,这很奇怪,因为this answer建议您以解决问题的方式来解决问题。也许已经过时了?