开始的时候,我以为是json_tokener_parse导致的Segmentation fault的问题,后来问作者,发现是 json_object_object_foreach的问题。
因为如果是封装成一个函数给别人用,别人可能会传递一个非json的字符串过来,那程序就会崩了,为了防止程序崩,要在生成json格式的字符串和遍历json格式的字符串之间加一个判断,是否是object或者array等。
我在github上问作者的链接:https://github.com/json-c/json-c/issues/623
解决办法,添加了425-430共6行。
407 void TestSegFunction(void)
408 {
409 int i = 0;
410 char *str = "\"{\"loop_number\":1}\"";
411 int len = strlen(str);
412 struct json_tokener *tok = NULL;
413 // char *str = "{\"loop_number\":1}";
414 json_object *pstObj = NULL;
415 json_object *sonPstObj = NULL;
416 pstObj = json_tokener_parse(str);
417 // pstObj = json_tokener_parse_ex(tok, str, len);
418
419 if (NULL == pstObj)
420 {
421 printf("%s : json_tokener_parse failed.\n", __FUNCTION__);
422 }
423 else
424 {
425 if (json_object_get_type(pstObj) != json_type_object)
426 {
427 json_object_put(pstObj);
428 printf("an error json string!\n");
429 return;
430 }
431 json_object_object_foreach(pstObj, key1, val1)
432 {
433 if (0 == strcmp(key1, LOOP_NUMBER))
434 {
435 i = json_object_get_int(val1);
436 printf("i = %d\n", i);
437 }
438 }
439 }
440 }