json_tokener_parse,分割错误

时间:2020-05-19 07:24:41

标签: c json-c

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行中将没有错误,因为此函数被其他人调用,并且它们可能输入错误字符串。我不想看到段错误来停止程序。有什么办法可以避免这种段落错误?

2 个答案:

答案 0 :(得分:4)

问题是我要遍历非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

答案 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。因此,如果您按照documentationhere中的描述直接使用它,则可以解决此问题。但是,这很奇怪,因为this answer建议您以解决问题的方式来解决问题。也许已经过时了?