CJSON庫

目錄

一、介紹

1、JSON是什么

2、為什么使用CJSON

3、JSON格式

二、使用CJSON構造JSON

1、創建對象

2、添加字段

3、轉換格式

4、釋放對象

?三、使用CJSON解析JSON

1、解析數據

2、 獲取字段

3、釋放對象


一、介紹

1、JSON是什么

? ? ? ? JSON是什么呢?JSON全稱JavaScript Object Notation,是一種輕量級的數據交換格式,主要用于存儲和交換文本信息。換句話說就是我們用JSON就是為了解析收到的數據和發送對方能夠解析的數據。

? ? ? ? 簡潔和清晰的層次結構使得JSON成為理想的數據交換語言,易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網絡傳輸速率。

2、為什么使用CJSON

? ? ? ?CJSON是一個輕量級、高效、易用的JSON解析庫,適用于C語言。 在做項目開發時,為什么大家都喜歡選擇CJSON來解析JSON字符串呢?CJSON工程文件很簡單,僅一個.c文件和一個.h文件,文件體積很小。除此之外,cJSON 庫通過簡單的 API 提供了高效的 JSON 處理功能。它允許用戶解析 JSON 字符串、創建和修改 JSON 對象、提取字段值,以及將 JSON 對象序列化為字符串。所以cJSON 庫非常適合在資源受限的嵌入式系統中使用。

3、JSON格式

????????對象在花括號 {} 中表示,一組鍵值對組成。鍵是字符串,值可以是字符串、數字、布爾值、數組、對象或 null。大家可以對照這個示例:

{"name": "xiao xin","age": 21,"is_student": true,"email": "xxxxxxxxxx@qq.com","skills": [ "Python", "C"],"address": {"street": "123 Main St","city": "Anytown","state": "CA","postal_code": "12345"}
}

二、使用CJSON構造JSON

????????在 C 語言中使用 cJSON 庫來構造 JSON 數據非常簡單。接下來我為大家整理了構造JSON常用的幾個函數。

1、創建對象

? ? ? ?我們需要先創建一個空的 cJSON 對象,表示一個 JSON 對象 {}

cJSON *cJSON_CreateObject(void);

2、添加字段

? ? ? ? 當創建完對象后,我們需要調用函數往該對象中添加相對應的字段。以下是我整理的常用函數。

(1)添加布爾值

void cJSON_AddBoolToObject(cJSON *object, const char *name, cJSON_bool value);

(2)添加空值

void cJSON_AddNullToObject(cJSON *object, const char *name);

(3)添加JSON數組字段

void cJSON_AddItemToObject(cJSON *object, const char *name, cJSON *item);

(4)添加JSON對象字段

void cJSON_AddItemToObject(cJSON *object, const char *name, cJSON *item);

3、轉換格式

? ? ? ? 最后,我們需要將 cJSON 對象轉換為 JSON 格式的字符串。

char *cJSON_Print(const cJSON *item);

? ? ? ? 該函數會將 cJSON 對象轉換為 JSON 格式的字符串并返回這個字符串的指針。這個函數非常有用,可以幫助將 cJSON 對象構建的 JSON 數據序列化為可讀的文本格式,便于輸出、存儲或傳輸。?

4、釋放對象

????????在使用 cJSON 解析 JSON 數據或構造 JSON 對象之后,我們需要釋放內存,以防止內存泄漏。

void cJSON_Delete(cJSON *c);

??????c:指向要刪除的 cJSON 對象的指針。

????????給大家一個參考代碼,大家可以自己動手試試看(編譯時注意鏈接CJSON動態庫):

#include <stdio.h>
#include <stdlib.h>
#include <cJSON.h>int main()
{// 創建一個 cJSON 對象,表示一個 JSON 對象 {}cJSON *root = cJSON_CreateObject();// 添加字符串字段cJSON_AddStringToObject(root, "name", "xiao xin");// 添加整數字段cJSON_AddNumberToObject(root, "age", 21);// 創建一個包含技能的 JSON 數組 "skills"cJSON *skillsArray = cJSON_CreateArray();cJSON_AddItemToArray(skillsArray, cJSON_CreateString("Python"));cJSON_AddItemToArray(skillsArray, cJSON_CreateString("C"));cJSON_AddItemToObject(root, "skills", skillsArray);// 添加布爾值字段cJSON_AddBoolToObject(root, "is_student", cJSON_True);// 添加空值字段cJSON_AddNullToObject(root, "notes");// 添加聯系信息 JSON 對象字段cJSON *contactObject = cJSON_CreateObject();cJSON_AddStringToObject(contactObject, "email", "xxxxxxxxxx@qq.com");cJSON_AddStringToObject(contactObject, "phone", "555-555-5555");cJSON_AddItemToObject(root, "contact", contactObject);// 將 cJSON 對象轉換為 JSON 格式的字符串char *json_string = cJSON_Print(root);printf("%s\n", json_string);    // 打印生成的 JSON 字符串cJSON_Delete(root);            // 釋放 cJSON 對象占用的內存free(json_string);            // 釋放 cJSON_Print 分配的內存return 0;
}

運行結果:

?三、使用CJSON解析JSON

?????????在 C 語言中使用 cJSON 庫來解析 JSON 數據非常簡單。接下來我為大家整理了構造JSON常用的幾個函數。

1、解析數據

? ? ? ? 我們需要先將JSON格式的字符串解析成CJSON對象。

cJSON *cJSON_Parse(const char *value);

? ? ? ? 該函數是解析 JSON 數據的關鍵函數,將一個JSON數據包,按照cJSON結構體的結構序列化整個數據包,并在堆中開辟一塊內存存儲cJSON結構體,成功后返回一個指向解析后的 cJSON 對象的指針。

2、 獲取字段

? ? ? ? 接下來我們從一個 cJSON 對象中獲取指定鍵的值。

cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);

? ? ? ? 該函數用于獲取JSON字符串字段值,成功返回一個指向cJSON類型的結構體指針。

3、釋放對象

? ? ? ? 和2、4是一樣的,這里就不再重復贅述了。

???????

?????????給大家一個參考代碼,大家可以自己動手試試看(編譯時注意鏈接CJSON動態庫):

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"int main() {// JSON 字符串const char *json_string = "{""\"name\":\"xiao xin\",""\"age\":21,""\"is_student\":true,""\"email\":\"xxxxx@qq.com\",""\"skills\":[\"Python\",\"C\"],""\"address\":{""\"street\":\"123 Main St\",""\"city\":\"Anytown\",""\"state\":\"CA\",""\"postal_code\":\"12345\"""}""}";// 解析 JSON 字符串cJSON *root = cJSON_Parse(json_string);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "Error before: %s\n", error_ptr);}return 1;}// 提取字段cJSON *name = cJSON_GetObjectItem(root, "name");cJSON *age = cJSON_GetObjectItem(root, "age");cJSON *is_student = cJSON_GetObjectItem(root, "is_student");cJSON *email = cJSON_GetObjectItem(root, "email");cJSON *skills = cJSON_GetObjectItem(root, "skills");cJSON *address = cJSON_GetObjectItem(root, "address");// 打印字段if (cJSON_IsString(name) && (name->valuestring != NULL)) {printf("Name: %s\n", name->valuestring);}if (cJSON_IsNumber(age)) {printf("Age: %d\n", age->valueint);}if (cJSON_IsBool(is_student)) {printf("Is student: %s\n", cJSON_IsTrue(is_student) ? "true" : "false");}if (cJSON_IsString(email) && (email->valuestring != NULL)) {printf("Email: %s\n", email->valuestring);}if (cJSON_IsArray(skills)) {printf("Skills:\n");cJSON *skill = NULL;cJSON_ArrayForEach(skill, skills) {if (cJSON_IsString(skill)) {printf("  - %s\n", skill->valuestring);}}}if (cJSON_IsObject(address)) {cJSON *street = cJSON_GetObjectItem(address, "street");cJSON *city = cJSON_GetObjectItem(address, "city");cJSON *state = cJSON_GetObjectItem(address, "state");cJSON *postal_code = cJSON_GetObjectItem(address, "postal_code");if (cJSON_IsString(street) && (street->valuestring != NULL)) {printf("Street: %s\n", street->valuestring);}if (cJSON_IsString(city) && (city->valuestring != NULL)) {printf("City: %s\n", city->valuestring);}if (cJSON_IsString(state) && (state->valuestring != NULL)) {printf("State: %s\n", state->valuestring);}if (cJSON_IsString(postal_code) && (postal_code->valuestring != NULL)) {printf("Postal Code: %s\n", postal_code->valuestring);}}// 釋放 cJSON 對象占用的內存cJSON_Delete(root);return 0;
}

運行結果:

?

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

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

相關文章

折半查找詳解

一&#xff1a;折半查找概念 折半查找&#xff08;也稱為二分查找&#xff09;是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始&#xff0c;如果中間元素正好是目標值&#xff0c;則搜索過程結束&#xff1b;如果目標值大于或小于中間元素&#x…

OceanBase 4.2.1 離線安裝

OceanBase 4.2.1 離線安裝 4.2 版本的OceanBase支持一鍵安裝&#xff0c;所以在線版本的安裝簡單了很多&#xff0c;但在無法連接網絡的情況下安裝就只能手動離線安裝。 注&#xff1a;如下安裝過程都是在同一臺機器上面進行&#xff0c;也就是只有一個節點&#xff0c;多個節…

SSM網上旅游信息管理系統-計算機畢業設計源碼06975

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2 系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據新增流程 2.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設…

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數 在做 db benchmarks 時&#xff0c;qps、tps 是衡量數據庫性能的關鍵指標,TPS : Transactions Per Second 是每秒事務數&#xff0c;即數據庫服務器在單位時間內處理的事務數。 橫向對比計劃幾類數據庫計算tps的方法。 …

微信小程序畢業設計-垃圾分類系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

AI產品哲學深探:從Perplexity CEO視角看搜索引擎的智慧啟示

一、開篇:歷史的分岔路口 在科技史的長河中,有些對話悄然決定了行業的走向。回溯至互聯網搜索的黎明時期,一場未被充分重視的會談在兩位科技巨擘之間展開。谷歌聯合創始人Larry Page與昔日搜索引擎巨頭Excite的CEO坐在了談判桌兩端,他們的對話不僅關乎一次潛在的并購,更預…

elasticsearch的查詢原理

數據結構 在 Elasticsearch 中,數據結構分布如下: 索引(Index) 索引是 Elasticsearch 中存儲數據的基本單元,相當于關系型數據庫中的數據庫。一個 Elasticsearch 集群中可以包含多個索引。 類型(Type) (從 Elasticsearch 7.0 開始已經被棄用): 在較早版本的 Elasticsearch…

Mathematica訓練課(46)-- 一些常用的畫圖函數

在前面的課程中&#xff0c;我們已經梳理了Plot的畫圖用法&#xff0c;今天就詳細梳理一下其他的畫圖函數用法&#xff1b; 1. 畫一條直線 2. Circle(圓) 3. Disk&#xff08;圓盤&#xff09; 4. 畫出一個矩形 5. 箭頭

c-前綴平方和序列(牛客小白月賽97)

題目&#xff1a; 假如一個長度為 n的正整數序列滿足所有前綴和 都是平方數&#xff0c;那么稱這種序列為前綴平方序列。 條件1<si<x 取模1e97 首先找出小于x的平方數有幾個。 然后用二項式定理 算出小于x的平方數中取n個的種數。 #include<bits/stdc.h> using…

大數據可視化實驗(六)——ECharts與pyecharts數據可視化

目錄 一、實驗目的... 1 二、實驗環境... 1 三、實驗內容... 1 1、ECharts可視化制作.. 1 1&#xff09;使用ECharts繪制折線圖顯示一周的天氣變換。... 1 2&#xff09;使用ECharts繪制柱狀圖顯示商品銷量的變化。... 4 2、pyecharts可視化制作.. 7 1&#xff09;使用…

beautifulSoup庫

是什么? Beautiful Soup(簡稱BS4)是一種強大而靈活的HTML和XML解析庫,廣泛用于Python爬蟲和數據采集中。相比正則表達式更加簡潔. Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的…

【知識學習】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一個強大的可視化Shader編輯工具&#xff0c;它允許用戶通過拖拽和連接節點的方式來創建Shader&#xff0c;而不是通過傳統的編寫代碼的方式。Shader Graph使得Shader的創建過程更加直觀和易于理解&#xff0c;特別是對于那些不熟悉Shader語言編程的美…

Java中的性能調優技巧與工具推薦

Java中的性能調優技巧與工具推薦 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來探討Java中的性能調優技巧與工具推薦。Java作為一門廣泛應用的編程語…

【OpenREALM學習筆記:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 圖中紅色框為頭文件中所涉及到的函數、變量和結構體 核心函數 PoseEstimation::process() 其核心作用為執行位姿估計的處理流程&#xff0c;并返回是否在此循環中進行了任何處理。 在這個函數中判斷并完成地理坐標的初始化或這地理坐標的更新。 這里需要…

QTreeView第一列自適應

通過setStretchLastSection(bool stretch)可以設置最后一列自適應,對于QTreeView,stretch默認為true。但有時候我們需要設置第一列自適應,比如文件瀏覽器,共有名稱、大小和修改日期三列,大小和日期的寬度幾乎是固定的,但名稱卻可長可短,此時我們希望在窗口大小變化時,第…

IDEA中Maven配置依賴和排除依賴

目錄 依賴配置 添加依賴的幾種方式&#xff1a; 1.利用中央倉庫搜索的依賴坐標 2.利用IDEA工具搜索依賴 3.熟練上手maven后&#xff0c;快速導入依賴 排除依賴 依賴配置 依賴&#xff1a;指當前項目運行所需要的jar包。一個項目中可以引入多個依賴&#xff1a; 例如&am…

python r”, b”, u”, f” 前綴詳解

1、r前綴 一般來說&#xff0c;\n’是一個換行符&#xff0c;是一個字符串&#xff1b;而加上r為前綴后&#xff0c;不會以任何特殊方式處理反斜杠。因此&#xff0c;r"\n" 是包含 ‘\’ 和 ‘n’ 的雙字符字符串&#xff1b;示例如下&#xff1a; >>> pr…

Go-知識測試-工作機制

Go-知識測試-工作機制 生成test的maintest的main如何啟動case單元測試 runTeststRunnertesting.T.Run 示例測試 runExamplesrunExampleprocessRunResult 性能測試 runBenchmarksrunNtesting.B.Run 在 Go 語言的源碼中&#xff0c;go test 命令的實現主要在 src/cmd/go/internal…

Java面試題:解釋反應式編程的概念,并討論如何在Java中使用RxJava或Project Reactor實現

反應式編程&#xff08;Reactive Programming&#xff09;是一種基于異步數據流和變化傳播的編程范式。它強調通過聲明式編程來處理異步事件流和數據流&#xff0c;簡化了復雜的異步操作和并發編程。反應式編程適用于處理異步事件、多線程處理、大量數據流、用戶交互等場景。 …

零基礎快速上手HarmonyOS ArkTS開發4---從簡單的頁面開始

接著上一次零基礎快速上手HarmonyOS ArkTS開發3---應用程序框架的繼續往下。 常用基礎組件&#xff1a; 概述&#xff1a; 關于組件的一些基礎概念就里就不多說了&#xff0c;官方有很詳細的說明&#xff0c;而在HarmonyOS按功能分有如下幾大類組件&#xff1a;基礎組件、容…