在?cJSON?庫中,沒有直接提供?一個函數來專門給 JSON 字符串添加轉義(如將?"
?轉義為?\"
,\n
?轉義為?\\n
?等)。
但 cJSON 在?序列化(cJSON_Print
?或?cJSON_PrintUnformatted
)?時會自動處理轉義字符,確保生成的 JSON 字符串是合法的。
如何讓 cJSON 處理轉義?
1. 使用?cJSON_Print
?或?cJSON_PrintUnformatted
當你將一個字符串(如?"Hello \"World\"\n"
)存入?cJSON_String
?并使用?cJSON_Print
?序列化時,cJSON 會自動添加轉義:
#include "cJSON.h"
#include <stdio.h>int main() {cJSON *root = cJSON_CreateObject();cJSON_AddStringToObject(root, "message", "Hello \"World\"\n"); // 字符串包含引號和換行符char *json_str = cJSON_Print(root); // 自動轉義printf("%s\n", json_str);cJSON_Delete(root);free(json_str);return 0;
}
輸出(自動轉義后的合法 JSON):
{"message": "Hello \"World\"\n"
}
關鍵點:
-
cJSON_Print
?和?cJSON_PrintUnformatted
?在生成 JSON 字符串時,會自動轉義:-
"
?→?\"
-
\
?→?\\
-
\n
?→?\\n
-
\t
?→?\\t
-
其他控制字符也會被轉義。
-
2. 手動轉義(如果需要單獨處理字符串)
如果?不經過 cJSON 序列化,而是想手動處理字符串的轉義,可以自己實現一個函數,例如:
#include <string.h>
#include <stdlib.h>char *escape_json_string(const char *input) {const char *p = input;char *output = malloc(strlen(input) * 2 + 1); // 預留足夠空間char *q = output;while (*p) {switch (*p) {case '\"': *q++ = '\\'; *q++ = '\"'; break;case '\\': *q++ = '\\'; *q++ = '\\'; break;case '\b': *q++ = '\\'; *q++ = 'b'; break;case '\f': *q++ = '\\'; *q++ = 'f'; break;case '\n': *q++ = '\\'; *q++ = 'n'; break;case '\r': *q++ = '\\'; *q++ = 'r'; break;case '\t': *q++ = '\\'; *q++ = 't'; break;default: *q++ = *p; break;}p++;}*q = '\0';return output;
}int main() {const char *str = "Hello \"World\"\n";char *escaped = escape_json_string(str);printf("Original: %s\n", str);printf("Escaped: %s\n", escaped);free(escaped);return 0;
}
輸出:
Original: Hello "World"
Escaped: Hello \"World\"\n
總結
方法 | 適用場景 | 是否推薦 |
---|---|---|
cJSON_Print ?/?cJSON_PrintUnformatted | 自動在 JSON 序列化時轉義 | ? 推薦 |
手動轉義函數 | 單獨處理字符串,不經過 cJSON 序列化 | ?? 需要自己管理內存 |
推薦做法:
??直接使用?cJSON_Print
,讓 cJSON 在序列化時自動處理轉義,避免手動管理轉義邏輯。
如果你有特殊需求(如僅轉義字符串而不生成完整 JSON),可以自己實現轉義函數(參考上面的?escape_json_string
)。