在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费
截取部分含有JSON部分的代码进行展示
char *str = " { \"title\":\"JSON Example\", \"author\": { \"name\":\"John Doe\", \"age\": 35, \"isVerified\":true }, \"tags\":[\"json\", \"syntax\", \"example\"], \"rating\": 4.5, \"isPublished\":false, \"comments\": null }";
按照JSON格式,在引号前边都需要加上 \ 反斜杠
其余部分的代码与本次的错误分享无关,暂不截图
打开终端执行 gcc -o json_test json_test.c 命令对本测试代码进行编译
以下为在编译过程中出现的报错,
可以发现报错的部分非常的多,而且都明显的指向 \ 反斜杠这一 方面的错误
以下为全部的报错
json_test.c: In function ‘main’: json_test.c:6:14: error: stray ‘\’ in program char *str = \" ^ json_test.c:6:15: warning: missing terminating " character char *str = \" ^ json_test.c:6:15: error: missing terminating " character json_test.c:8:5: error: stray ‘\’ in program \"title\":\"JSON Example\", ^ json_test.c:8:6: warning: missing terminating " character \"title\":\"JSON Example\", ^ json_test.c:8:6: error: missing terminating " character \"title\":\"JSON Example\", ^~~~~~~~~~~~~~~~~~~~~~~~~~ json_test.c:9:5: error: stray ‘\’ in program \"author\": { ^ json_test.c:9:6: warning: missing terminating " character \"author\": { ^ json_test.c:9:6: error: missing terminating " character \"author\": { ^~~~~~~~~~~~ json_test.c:10:5: error: stray ‘\’ in program \"name\":\"John Doe\", ^ json_test.c:10:6: warning: missing terminating " character \"name\":\"John Doe\", ^ json_test.c:10:6: error: missing terminating " character \"name\":\"John Doe\", ^~~~~~~~~~~~~~~~~~~~~ json_test.c:11:5: error: stray ‘\’ in program \"age\": 35, ^ json_test.c:11:6: warning: missing terminating " character \"age\": 35, ^ json_test.c:11:6: error: missing terminating " character \"age\": 35, ^~~~~~~~~~~ json_test.c:12:5: error: stray ‘\’ in program \"isVerified\":true ^ json_test.c:12:6: warning: missing terminating " character \"isVerified\":true ^ json_test.c:12:6: error: missing terminating " character \"isVerified\":true ^~~~~~~~~~~~~~~~~~ json_test.c:7:5: error: empty scalar initializer { ^ json_test.c:7:5: note: (near initialization for ‘str’) json_test.c:14:5: error: stray ‘\’ in program \"tags\":[\"json\", \"syntax\", \"example\"], ^ json_test.c:14:6: warning: missing terminating " character \"tags\":[\"json\", \"syntax\", \"example\"], ^ json_test.c:14:6: error: missing terminating " character \"tags\":[\"json\", \"syntax\", \"example\"], ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ json_test.c:15:5: error: stray ‘\’ in program \"rating\": 4.5, ^ json_test.c:15:6: warning: missing terminating " character \"rating\": 4.5, ^ json_test.c:15:6: error: missing terminating " character \"rating\": 4.5, ^~~~~~~~~~~~~~~ json_test.c:16:5: error: stray ‘\’ in program \"isPublished\":false, ^ json_test.c:16:6: warning: missing terminating " character \"isPublished\":false, ^ json_test.c:16:6: error: missing terminating " character \"isPublished\":false, ^~~~~~~~~~~~~~~~~~~~~ json_test.c:17:5: error: stray ‘\’ in program \"comments\": null ^ json_test.c:17:6: warning: missing terminating " character \"comments\": null ^ json_test.c:17:6: error: missing terminating " character \"comments\": null ^~~~~~~~~~~~~~~~~ json_test.c:18:5: error: expected identifier or ‘(’ before ‘}’ token }\"; ^ json_test.c:18:6: error: stray ‘\’ in program }\"; ^ json_test.c:18:7: warning: missing terminating " character }\"; ^ json_test.c:18:7: error: missing terminating " character }\"; ^~
对于这个问题的解决其实不难,只需要在每一行的后边加上连词符号 \ 即可,将多行拼成1行
代码做出修改后如下:
char *str = "\
{ \
\"title\":\"JSON Example\",\
\"author\": { \
\"name\":\"John Doe\",\
\"age\": 35,\
\"isVerified\":true\
}, \
\"tags\":[\"json\", \"syntax\", \"example\"],\
\"rating\": 4.5,\
\"isPublished\":false,\
\"comments\": null\
}";
再次对其进行编译,之前的报错基本消失
但是,我们发现了另外一个警告错误
json_test.c: In function ‘main’: json_test.c:8:32: warning: backslash and newline separated by space \"title\":\"JSON Example\",\ json_test.c:14:51: warning: backslash and newline separated by space \"tags\":[\"json\", \"syntax\", \"example\"], \ /tmp/ccFimHV4.o: In function `main': json_test.c:(.text+0x22): undefined reference to `cJSON_Parse' json_test.c:(.text+0x39): undefined reference to `cJSON_GetObjectItem' collect2: error: ld returned 1 exit status
同时回到text editor代码中,发现代码中反斜杠居然会出现两种颜色
这个现象很有意思,一开始并没有注意这是为什么,后边结合警告
在这几个颜色不同的反斜杠之间瞎点,发现一个小问题
这些不同于大众的颜色的反斜杠,后边带有空格,其他的没有
尝试着将后边的空格去掉之后,再次进行编译,前边的警告错误荡然无存