json_tokener_parse ,分段错误

json_tokener_parse , Segmentation fault

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行不会报错,因为这个函数是别人调用的,他们可能会输入错误字符串。我不想看到段错误停止程序。有什么办法可以避免这种段落错误吗?

我认为代码行 410 不起作用,而 411 行。

char *str = "\"{\"loop_number\":1}\"";

这是无效的 JSON,因为 JSON 不能以 " 开头,这行代码实际上在做什么。它为您提供字符串 "{"loop_number": 1}}"。就用c的print函数验证一下。但是 JSON 可以以 { 开头。

char *str = "{\"loop_number\":1}";

这给你字符串 {"loop_number": 1} (看,{ } 周围没有 ")。

希望对您有所帮助。

编辑

由于代码在第 414 行中断,您可以使用 json_tokener_parse_ex directly. In fact, json_tokener_parse seems to simply wrap json_tokener_parse_ex. If you therefore directly use it as described in the documentation and as in here you maybe solve this issue. It is however weired, as 建议按照您的方式解决问题。也许它已经过时了?

问题是我正在尝试迭代不属于 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.