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

4

2 回答 2

2

问题是我试图迭代不是 type 的东西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

于 2020-05-20T00:51:09.093 回答
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似乎只是简单地 wrap json_tokener_parse_ex因此,如果您按照文档中的描述直接使用它,那么您可能会解决此问题然而,这很奇怪,因为这个答案建议以您的方式解决您的问题。也许它已经过时了?

于 2020-05-19T07:45:26.683 回答