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 = %dn", i);
}
}
}
}
如第 410 行和 411 行所示,如果使用 410 行代码,则 414 行函数调用中会出现段错误。如果使用 411 行代码,则 414 行不会有错误,因为此函数由其他人调用,他们可能会输入错误字符串。我不想看到段错误来停止程序。有没有办法避免这种段落错误?
问题是我正在尝试迭代不属于json_type_object
类型的东西。 我需要添加一个像
if (json_object_get_type(pstObj) != json_type_object) {
...handle error...
}
在json_object_object_foreach
之前.
这个答案来自 https://github.com/json-c/json-c/issues/623。
代码行 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
.因此,如果您按照文档中和此处的说明直接使用它,您可能会解决此问题。然而,这很奇怪,因为这个答案建议以你的方式解决你的问题。也许它已经过时了?