cJson是一款C語(yǔ)言實(shí)現(xiàn)的JSON解析器和生成器,廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā)、網(wǎng)絡(luò)數(shù)據(jù)傳輸、云計(jì)算等領(lǐng)域。在處理JSON數(shù)據(jù)時(shí),經(jīng)常會(huì)遇到轉(zhuǎn)義字符,如“\n”表示換行,“\t”表示制表符,“\”表示轉(zhuǎn)義字符本身等。在某些情況下,我們需要對(duì)JSON字符串進(jìn)行反轉(zhuǎn)義,以便更方便地進(jìn)行數(shù)據(jù)處理,本文將介紹如何使用cJson去掉轉(zhuǎn)義字符串。
#include "cJSON.h" #includechar *unescape(cJSON *json){ char *res = NULL; int offset = 0; int len = strlen(json->valuestring); int i = 0; for(i = 0; i< len; i++){ if(json->valuestring[i] == '\\' && i< (len - 1)){ i++; switch(json->valuestring[i]){ case '\"': res = realloc(res, offset + 1); res[offset++] = '\"'; break; case '\\': res = realloc(res, offset + 1); res[offset++] = '\\'; break; case '\/': res = realloc(res, offset + 1); res[offset++] = '/'; break; case 'b': res = realloc(res, offset + 1); res[offset++] = '\b'; break; case 'f': res = realloc(res, offset + 1); res[offset++] = '\f'; break; case 'n': res = realloc(res, offset + 1); res[offset++] = '\n'; break; case 'r': res = realloc(res, offset + 1); res[offset++] = '\r'; break; case 't': res = realloc(res, offset + 1); res[offset++] = '\t'; break; case 'u': if((i + 4)< len){ char t[5] = {0}; memcpy(t, json->valuestring + i + 1, 4); int c = (int) strtol(t, NULL, 16); if(c >0){ res = realloc(res, offset + 1); res[offset++] = (char)c; i += 4; break; } } default: break; } }else{ res = realloc(res, offset + 1); res[offset++] = json->valuestring[i]; } } res = realloc(res, offset + 1); res[offset] = '\0'; return res; }
上述代碼中的unescape函數(shù)實(shí)現(xiàn)了反轉(zhuǎn)義,接收一個(gè)json對(duì)象作為參數(shù),并返回一個(gè)char類型指針,指向反轉(zhuǎn)義后的字符串。
在函數(shù)內(nèi)部,首先獲取原始字符串長(zhǎng)度和指針,接著遍歷字符串,如果遇到轉(zhuǎn)義字符“\"”并且后面緊跟著一個(gè)有效字符,則對(duì)其進(jìn)行相應(yīng)的反轉(zhuǎn)義處理,例如將“\n”轉(zhuǎn)化為換行符。如果是其他字符,則直接將其拼接到結(jié)果字符串中。最后返回結(jié)果字符串。