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
.
之前
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
.