C语言拼接JSON字符串时最后大括号无法正常输出的问题
解决C语言中snprintf拼接JSON时末尾大括号无法正常输出的问题
嘿,我懂你这会儿的糟心——用snprintf拼JSON,结果最后那对大括号死活不出来,确实挺挠头的。咱们一步步拆解问题,把它搞定:
可能的核心原因
你遇到的问题大概率逃不出这几个情况:
- 缓冲区
buf尺寸不够,snprintf直接截断了末尾的大括号内容 - JSON拼接的顺序或结构不完整,大括号的位置没放对
- 没处理好JSON的引号转义,导致整体结构混乱
具体解决方案
1. 先把缓冲区搞够大
你定义的buf[306]可能太小了!如果前半段JSON(test)+ 用户输入(trackingnum)+ 末尾大括号的总长度超过306,snprintf就会自动截断内容,自然看不到最后的大括号。建议直接把缓冲区调大,比如buf[512]甚至buf[1024],先避开截断问题。
2. 按正确的JSON结构拼接
要保证拼接后的JSON是完整的,每个开括号对应闭括号。比如你的test应该是JSON的前半部分,刚好到TrackingNumber字段的引号位置,插入用户输入后,再补上闭合的引号和所有剩余的大括号。
给你写个完整的示例代码参考:
#include <stdio.h> #include <string.h> int main() { // 前半段JSON:到TrackingNumber字段的开头引号位置 const char *json_prefix = "{\"UPSSecurity\":{\"UsernameToken\":{\"Username\":\"your_user\",\"Password\":\"your_pass\"},\"ServiceAccessToken\":{\"AccessLicenseNumber\":\"your_license\"}},\"TrackRequest\":{\"Request\":{\"RequestAction\":\"Track\",\"RequestOption\":\"1\"},\"TrackingNumber\":\""; char trackingnum[18]; // 存用户输入的追踪号 const char *json_suffix = "\"}}}"; // 闭合TrackingNumber的引号+所有剩余大括号 char buf[512]; // 足够大的缓冲区 // 模拟用户输入追踪号 strcpy(trackingnum, "1Z999AA10123456784"); // 拼接完整JSON int result_len = snprintf(buf, sizeof(buf), "%s%s%s", json_prefix, trackingnum, json_suffix); // 检查是否被截断 if (result_len >= sizeof(buf)) { printf("警告:缓冲区不够,JSON内容被截断啦!\n"); return 1; } // 输出最终JSON printf("生成的完整JSON:\n%s\n", buf); return 0; }
3. 一定要检查snprintf的返回值
snprintf会返回如果缓冲区足够大时应该生成的字符串总长度,如果这个值大于等于你定义的缓冲区大小,说明内容被截断了,这时候必须调大缓冲区尺寸。
4. 验证JSON结构完整性
拼接完后,可以把输出的JSON复制到本地的JSON校验工具里(不用跳网站),检查有没有语法错误,确保所有大括号、引号都是配对的。
额外提醒
如果用户输入的trackingnum包含特殊字符(比如引号、反斜杠),还得做转义处理,不然会直接破坏JSON结构——不过UPS追踪号一般都是字母数字,暂时可能不用,但最好留个心眼。
内容的提问来源于stack exchange,提问作者CryptoCat
相关产品推荐
相关产品推荐

