C-JSON接口的使用

一、cJSON 核心數據結構

cJSON 的所有操作都圍繞?cJSON?結構體展開,它代表 JSON 中的一個節點(可以是對象、數組、字符串、數字等):

typedef struct cJSON 
{struct cJSON *next, *prev;  // 用于鏈表(數組/對象的子節點)struct cJSON *child;        // 子節點(對象/數組的元素)int type;                   // 節點類型(見下方宏定義)char *valuestring;          // 字符串值(type為字符串時有效)int valueint;               // 整數值(type為數字時可用)double valuedouble;         // 浮點值(type為數字時有效)char *string;               // 鍵名(對象的鍵)
} cJSON;

節點類型宏定義(部分常用):

  • cJSON_False:布爾值 false
  • cJSON_True:布爾值 true
  • cJSON_NULL:null
  • cJSON_Number:數字(整數 / 浮點數)
  • cJSON_String:字符串
  • cJSON_Array:數組
  • cJSON_Object:對象

二、解析 JSON 字符串(核心接口)

1. 解析整個 JSON 字符串
cJSON *cJSON_Parse(const char *value);
  • 功能:將 JSON 字符串解析為 cJSON 結構體(根節點)。
  • 參數:value?為 JSON 格式的字符串。
  • 返回:成功返回根節點指針,失敗返回?NULL
2. 獲取節點類型
int cJSON_GetType(const cJSON *item);
3. 從對象中獲取子節點(按鍵名)
cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
  • 功能:從 JSON 對象中根據鍵名獲取子節點。
  • 參數:object?為對象節點,string?為鍵名。
  • 返回:找到的子節點指針,未找到返回?NULL
4. 獲取數組長度
int cJSON_GetArraySize(const cJSON *array);

功能:獲取 JSON 數組的元素個數

5. 從數組中獲取元素(按索引)
cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
  • 功能:從數組中根據索引獲取元素。
  • 參數:array?為數組節點,index?為索引(從 0 開始)。
6. 釋放解析后的 cJSON 結構
void cJSON_Delete(cJSON *c);
  • 功能:釋放整個 cJSON 鏈表(根節點及所有子節點),防止內存泄漏。

三、構建 JSON 字符串(核心接口)

1. 創建基礎類型節點
cJSON *cJSON_CreateNumber(double num);       // 創建數字節點
cJSON *cJSON_CreateString(const char *string); // 創建字符串節點
cJSON *cJSON_CreateBool(cJSON_bool boolean);   // 創建布爾節點
cJSON *cJSON_CreateNull(void);                // 創建 null 節點
2. 創建數組和對象
cJSON *cJSON_CreateArray(void);  // 創建空數組
cJSON *cJSON_CreateObject(void); // 創建空對象
3. 向數組添加元素
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
  • 功能:將節點添加到數組末尾。
4. 向對象添加鍵值對
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
  • 功能:向對象添加鍵為?string、值為?item?的鍵值對。
5. 將 cJSON 結構轉為字符串
char *cJSON_Print(const cJSON *item);         // 格式化輸出(帶縮進)
char *cJSON_PrintUnformatted(const cJSON *item); // 緊湊輸出(無縮進)
  • 返回:動態分配的字符串,使用后需用?free()?釋放。

6. 將 cJSON出錯信息打印

printf("%s\n", ,cJSON_GetErrorPtr());

四、示例代碼:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"  // 需包含 cJSON 頭文件// 解析 JSON 示例
void parse_json_example(const char *json_str) 
{// 1. 解析 JSON 字符串cJSON *root = cJSON_Parse(json_str);if (root == NULL) {printf("解析 JSON 失敗: %s\n", cJSON_GetErrorPtr());return;}// 2. 獲取 "success" 字段(字符串)cJSON *success = cJSON_GetObjectItem(root, "success");if (success && success->type == cJSON_String) {printf("請求狀態: %s\n", success->valuestring);}// 3. 獲取 "result" 對象cJSON *result = cJSON_GetObjectItem(root, "result");if (result && result->type == cJSON_Object) {// 4. 從 result 中獲取城市和溫度cJSON *city = cJSON_GetObjectItem(result, "city");cJSON *temp = cJSON_GetObjectItem(result, "temp");if (city && city->type == cJSON_String) {printf("城市: %s\n", city->valuestring);}if (temp && temp->type == cJSON_String) {printf("溫度: %s℃\n", temp->valuestring);}// 5. 解析 "index" 數組cJSON *index_array = cJSON_GetObjectItem(result, "index");if (index_array && index_array->type == cJSON_Array) {int size = cJSON_GetArraySize(index_array);printf("生活指數(共 %d 條):\n", size);for (int i = 0; i < size; i++) {cJSON *item = cJSON_GetArrayItem(index_array, i);if (item && item->type == cJSON_String) {printf("  - %s\n", item->valuestring);}}}}// 6. 釋放資源cJSON_Delete(root);
}// 構建 JSON 示例
void create_json_example() 
{// 1. 創建根對象cJSON *root = cJSON_CreateObject();if (root == NULL) {printf("創建根對象失敗\n");return;}// 2. 向根對象添加字段cJSON_AddItemToObject(root, "name", cJSON_CreateString("天氣查詢"));cJSON_AddItemToObject(root, "version", cJSON_CreateNumber(1.0));cJSON_AddItemToObject(root, "enabled", cJSON_CreateBool(1));  // true// 3. 創建數組并添加元素cJSON *cities = cJSON_CreateArray();cJSON_AddItemToArray(cities, cJSON_CreateString("北京"));cJSON_AddItemToArray(cities, cJSON_CreateString("上海"));cJSON_AddItemToObject(root, "support_cities", cities);// 4. 轉為字符串并打印char *json_str = cJSON_Print(root);  // 格式化輸出if (json_str) {printf("\n構建的 JSON:\n%s\n", json_str);free(json_str);  // 釋放字符串}// 5. 釋放資源cJSON_Delete(root);
}int main() 
{// 模擬 API 返回的 JSON 字符串const char *api_response = "{""\"success\":\"1\",""\"result\":{""\"city\":\"北京\",""\"temp\":\"25\",""\"weather\":\"晴\",""\"index\":[\"適宜出行\",\"注意防曬\"]""}""}";// 解析示例parse_json_example(api_response);// 構建示例create_json_example();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94584.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TypeScript 類型系統(二)

本文將簡述類型系統中的類型聯合&#xff0c;通俗的來說就是將一個變量規定為不是某一個類型&#xff0c;而是某些類型&#xff0c;我們在日常開發中很常見下面會給出例子。值類型在JavaScript中用const聲明的變量是不可以再次賦值的&#xff0c;也就是常量。在TypeScript中也可…

無刷電機控制 - STM32F405+CubeMX+HAL庫+SimpleFOC08,速度閉環控制(有電流環)

導言 《STM32F405CubeMXHAL庫SimpleFOC07&#xff0c;ADC采樣相電流&#xff0c;頻率20KHz&#xff08;TIM1觸發Injected Sampling中斷》&#xff0c;有了上一章節的電流采樣后&#xff0c;可以完善速度閉環控制了。 有了電流環的速度閉環控制&#xff0c;電機的扭矩會顯得大很…

【機械故障】共振峰

機械故障信號分析 提示:學習筆記 1、機械振動名詞 2、共振峰 共振峰 機械故障信號分析 1、機械振動名詞 [2、共振峰](https://editor.csdn.net/md/?not_checkout=1&activity_id=10937&spm=1057.2600.3001.10415) @[TOC](共振峰) `詳細講解共振峰、共振頻率帶、共振頻…

力扣(用隊列實現棧)

解析 LeetCode 225. 用隊列實現棧&#xff1a;單隊列的巧妙運用 一、題目分析&#xff08;一&#xff09;功能需求 實現 MyStack 類&#xff0c;支持棧的四種操作&#xff1a; push(int x)&#xff1a;將元素壓入棧頂。pop()&#xff1a;移除并返回棧頂元素。top()&#xff1a;…

服務器Docker 安裝和常用命令總結

Docker 安裝和常用命令總結Docker 是一種開源平臺&#xff0c;用于自動化應用程序的部署、擴展和管理。通過將應用程序及其依賴打包到一個輕量級、可移植的容器中&#xff0c;Docker 能夠在任何地方統一運行&#xff0c;解決了不同環境間的兼容性問題。本篇文章將介紹 Docker 的…

2025年廣東省無線電管理普法宣傳活動

一、無線電發射設備型號核準相關制度及要求1.型號核準設備類型&#xff1a;一、公眾網移動通信設備二、專用通信設備三、無線接入設備四、廣播發射設備五、雷達設備六、導航設備七、衛星通信設備(含終端地球站)無線電發射設備八、公眾網移動通信模塊九、無線接入模塊十、其他設…

使用 Whisper 將南蒂羅爾方言語音轉錄為標準德語文本的研究

使用 Whisper 將南蒂羅爾方言語音轉錄為標準德語文本的研究 原文:Speech transcription from South Tyrolean Dialect to Standard German with Whisper 本研究展示了首個經過微調的Whisper模型,用于將南蒂羅爾方言語音自動翻譯為標準德語文本。為了滿足字幕和翻譯方面尚未被…

Nexus管理maven倉庫和jar包的配置和使用

登錄nexus以后點擊Settings-Repository-Repositories-Create repository 選擇maven2(hosted)創建兩個倉庫一個是Release叫做monitor-releases&#xff1a;一個是Snapshot叫做monitor-snapshots&#xff1a;在創建一個maven2(group)叫做monitor將maven-central&#xff08;用于存…

瘋狂星期四文案網第50天運營日記

網站運營第50天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今天流量減了一些&#xff0c;我發現我的瘋狂星期四的詞沒有排名第一了&#xff0c;感覺應該是抽象文案這個導致的&#xff0c;因為我發了…

計算機視覺學習路線:從入門到進階的完整指南

計算機視覺學習路線&#xff1a;從入門到進階的完整指南 計算機視覺&#xff08;Computer Vision, CV&#xff09;是人工智能領域最熱門和最具前景的方向之一&#xff0c;它賦予機器“看”和“理解”圖像與視頻的能力。無論你是學生、工程師還是對AI感興趣的愛好者&#xff0c…

移動應用抓包與調試實戰 Charles工具在iOS和Android中的應用

隨著移動互聯網的發展&#xff0c;幾乎所有應用都依賴API接口進行數據交互。無論是登錄注冊、支付功能&#xff0c;還是新聞資訊加載&#xff0c;背后都需要與服務器頻繁通信。如何快速定位問題、驗證數據傳輸、模擬弱網環境&#xff0c;成為移動端開發者日常工作中的關鍵任務。…

【Python NTLK自然語言處理庫】

安裝流程 import nltk nltk.download()運行后出現一個界面&#xff0c;然后按DownloadTokenize ###分詞 from nltk.tokenize import word_tokenize text "The vendor paid $20,000,000." tokens word_tokenize(text) print(tokens)輸出 [The, vendor, paid, $, 20,…

GitHub 熱榜項目 - 日榜(2025-08-25)

GitHub 熱榜項目 - 日榜(2025-08-25) 生成于&#xff1a;2025-08-25 統計摘要 共發現熱門項目&#xff1a;20 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術趨勢&#xff1a;1&#xff09;AI代理開發成主流&#xff0c;如moeru-ai/airi的虛擬伴…

Mac相冊重復照片終結指南:技術流清理方案

你的Mac相冊是否變成了"重復照片博物館"&#xff1f;同一場景的多個版本、連續拍攝的相似圖片、不同設備導入的重復文件...這些數字冗余正在悄無聲息地吞噬著寶貴的存儲空間。本文將為你提供一套完整的技術解決方案。重復照片問題的技術分析重復類型分類從技術角度&a…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(19):文法復習+單詞第7回1

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;19&#xff09;&#xff1a;文法單詞第7回&#xff11; 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff11;ー 復習3、單詞&#xff08;1&#xff09;日語單詞  …

完美世界招數據倉庫工程師咯

數據倉庫工程師-偏BI方向 &#xff08;崗位信息經過jobleap.cn授權&#xff0c;可在CSDN發布&#xff09;完美世界 北京 職位描述 負責數據倉庫架構設計、建模和ETL開發&#xff0c;構建可擴展的數據倉庫和分析解決方案&#xff1b; 負責對數據倉庫的性能和效率優化&#xff1…

RabbitMQ面試精講 Day 26:RabbitMQ監控體系建設

【RabbitMQ面試精講 Day 26】RabbitMQ監控體系建設 在“RabbitMQ面試精講”系列的第26天&#xff0c;我們將聚焦于RabbitMQ監控體系建設這一關鍵運維主題。作為消息中間件的核心組件&#xff0c;RabbitMQ一旦出現消息積壓、節點宕機或資源耗盡等問題&#xff0c;將直接影響系統…

把word按章節分為n份 一個文檔拆分為多份格式不變

如果你有一個word文檔&#xff0c;里面有很多章節&#xff0c;你想按照章節把它分為N份&#xff0c;每一份存放在一個獨立的文檔中&#xff0c;而且拆分之后的文檔格式和圖片都保持不變。那么你可以試一下這個工具。 #word拆分 #word按章節拆分 #word分為n份 #docx拆分章節 把w…

項目歷程—緩存系統v1

實現目標1&#xff1a;輸入key&#xff0c;value可以存儲新建一個文件&#xff0c;并存儲一個值 (√) 實現目標2&#xff1a;封裝方法&#xff0c;循環創建1000個文件&#xff0c;分別存儲一個值 (√) 實現目標3&#xff1a;通過輸入一個key可以檢測到文件里面的內容值 (√) 兩…