基于esp32-s3,寫一個實現json鍵值對數據創建和讀寫解析c例程

以下是一個基于 ESP32 - S3 使用 ESP - IDF 框架實現 JSON 鍵值對數據創建、讀寫和解析的 C 語言例程。

環境準備

確保你已經安裝了 ESP - IDF 開發環境,并且可以正常編譯和燒錄代碼到 ESP32 - S3 開發板。

代碼示例

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "cJSON.h"// 日志標簽
static const char *TAG = "JSON_EXAMPLE";// 創建 JSON 鍵值對數據
char* create_json_data() {// 創建一個新的 JSON 對象cJSON *root = cJSON_CreateObject();if (root == NULL) {ESP_LOGE(TAG, "Failed to create JSON object");return NULL;}// 添加鍵值對到 JSON 對象cJSON_AddStringToObject(root, "name", "John Doe");cJSON_AddNumberToObject(root, "age", 30);cJSON_AddBoolToObject(root, "is_student", false);// 將 JSON 對象轉換為字符串char *json_string = cJSON_Print(root);if (json_string == NULL) {ESP_LOGE(TAG, "Failed to print JSON object");cJSON_Delete(root);return NULL;}// 刪除 JSON 對象cJSON_Delete(root);return json_string;
}// 解析 JSON 數據
void parse_json_data(const char *json_string) {// 解析 JSON 字符串cJSON *root = cJSON_Parse(json_string);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {ESP_LOGE(TAG, "Error before: %s", error_ptr);}return;}// 讀取鍵值對cJSON *name = cJSON_GetObjectItemCaseSensitive(root, "name");cJSON *age = cJSON_GetObjectItemCaseSensitive(root, "age");cJSON *is_student = cJSON_GetObjectItemCaseSensitive(root, "is_student");if (cJSON_IsString(name) && (name->valuestring != NULL)) {ESP_LOGI(TAG, "Name: %s", name->valuestring);}if (cJSON_IsNumber(age)) {ESP_LOGI(TAG, "Age: %d", age->valueint);}if (cJSON_IsBool(is_student)) {ESP_LOGI(TAG, "Is Student: %s", cJSON_IsTrue(is_student) ? "true" : "false");}// 刪除解析后的 JSON 對象cJSON_Delete(root);
}void app_main(void) {// 創建 JSON 數據char *json_string = create_json_data();if (json_string != NULL) {ESP_LOGI(TAG, "Created JSON data: %s", json_string);// 解析 JSON 數據parse_json_data(json_string);// 釋放 JSON 字符串內存cJSON_free(json_string);}
}

代碼解釋

  1. 引入頭文件:引入了?stdio.hstring.hesp_log.h?和?cJSON.h?頭文件,分別用于標準輸入輸出、字符串處理、ESP - IDF 日志和 JSON 處理。
  2. 創建 JSON 數據create_json_data()?函數創建一個新的 JSON 對象,并添加鍵值對。然后將 JSON 對象轉換為字符串并返回。
  3. 解析 JSON 數據parse_json_data()?函數解析傳入的 JSON 字符串,并讀取其中的鍵值對。最后打印出讀取到的值。
  4. 主函數:在?app_main()?函數中,調用?create_json_data()?函數創建 JSON 數據,打印創建的 JSON 字符串,然后調用?parse_json_data()?函數解析 JSON 數據。最后釋放 JSON 字符串占用的內存。

編譯和運行

將上述代碼保存為一個?.c?文件,例如?main.c,并將其放置在 ESP - IDF 項目的?main?目錄下。然后在終端中進入項目目錄,執行以下命令進行編譯和燒錄:

idf.py build
idf.py -p /dev/ttyUSB0 flash monitor

請將?/dev/ttyUSB0?替換為你的 ESP32 - S3 開發板所使用的串口設備。

注意事項

  • 本示例使用了?cJSON?庫,該庫是一個輕量級的 JSON 解析庫,已經集成在 ESP - IDF 中。
  • 在使用?cJSON?庫時,需要注意內存管理,避免內存泄漏。例如,在創建 JSON 對象和打印 JSON 字符串后,需要調用?cJSON_Delete()?和?cJSON_free()?函數釋放內存。

=================================================================

以下是幾個在 C 語言中多行書寫包含字符串和整型混合值的 JSON 鍵值對數據的例子,分別展示了不同的實現方式。

方式一:利用相鄰字符串常量自動拼接特性

#include <stdio.h>int main() {const char *json_data = "{""\"name\": \"John Doe\",""\"age\": 30,""\"city\": \"New York\",""\"id\": 12345,""\"email\": \"johndoe@example.com\"""}";printf("%s\n", json_data);return 0;
}
代碼解釋:
  • 編譯器會自動把相鄰的字符串常量拼接成一個完整的字符串。這里將 JSON 的各個鍵值對拆分成多行書寫,其中?"name"?和?"city""email"?的值是字符串,而?"age"?和?"id"?的值是整型。
  • 最后使用?printf?函數將拼接好的 JSON 字符串輸出。

方式二:使用字符串拼接函數

#include <stdio.h>
#include <string.h>int main() {char json[512] = "{ ";// 拼接字符串值的鍵值對strcat(json, "\"name\": \"John Doe\", ");// 拼接整型值的鍵值對char age_str[10];sprintf(age_str, "\"age\": %d, ", 30);strcat(json, age_str);strcat(json, "\"city\": \"New York\", ");char id_str[10];sprintf(id_str, "\"id\": %d, ", 12345);strcat(json, id_str);strcat(json, "\"email\": \"johndoe@example.com\" ");strcat(json, "}");printf("%s\n", json);return 0;
}
代碼解釋:
  • 首先定義一個足夠大的字符數組?json?用于存儲拼接后的 JSON 字符串,并初始化為?{?作為 JSON 對象的起始。
  • 對于字符串值的鍵值對,直接使用?strcat?函數進行拼接。
  • 對于整型值的鍵值對,先使用?sprintf?函數將整型值轉換為字符串格式,再將其拼接到?json?數組中。
  • 最后拼接上結束的花括號?},并使用?printf?函數輸出最終的 JSON 字符串。

方式三:使用宏定義輔助拼接

#include <stdio.h>#define JSON_KEY_VALUE(key, value) "\"" #key "\": " #value ","int main() {const char *json_data = "{"JSON_KEY_VALUE(name, "John Doe")JSON_KEY_VALUE(age, 30)JSON_KEY_VALUE(city, "New York")JSON_KEY_VALUE(id, 12345)"\"email\": \"johndoe@example.com\"""}";printf("%s\n", json_data);return 0;
}
代碼解釋:
  • 定義了一個宏?JSON_KEY_VALUE,它可以將鍵和值轉換為 JSON 鍵值對的字符串格式。
  • 在構建 JSON 字符串時,使用這個宏來處理大部分的鍵值對,對于一些特殊情況(如最后一個鍵值對不需要逗號)則直接書寫。
  • 最后將拼接好的 JSON 字符串輸出。

這幾種方式都能實現多行書寫包含字符串和整型混合值的 JSON 鍵值對數據,你可以根據實際情況選擇最合適的方法。

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

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

相關文章

MyBatis-Plus 使用 Wrapper 構建動態 SQL 有哪些優劣勢?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允許我們在開發時以面向對象的方式構建 SQL 的 WHERE 條件、ORDER BY、SELECT 字段列表等部分。與傳統的 MyBatis 在 XML 文件中…

STM32與i.MX6ULL內存與存儲機制全解析:從微控制器到應用處理器的設計差異

最近做FreeRTos&#xff0c;以及前面設計的RVOS&#xff0c;這種RTOS級別的系統內存上的分布與CortexA系列里面的分布有相當大的區別&#xff0c;給我搞糊涂了。 目錄 STM32&#xff08;Cortex-M系列&#xff09;的內存與存儲機制 Flash存儲內容RAM存儲內容啟動與運行時流程示例…

Eteam 0.3版本開發規劃

Eteam 0.1系列經歷了3個小版本&#xff0c;主要完成了團隊資料庫功能。 Eteam 0.2系列經歷了22個小版本&#xff0c;主要完成了白板和AI交互的能力。 目前的問題 目前白板上的數據有兩個來源&#xff0c;團隊資料庫和外部數據。外部數據和團隊資料庫數據邊界不是很清晰。 0.3版…

HTML5好看的水果蔬菜在線商城網站源碼系列模板5

文章目錄 1.設計來源1.1 主界面1.2 關于我們1.3 商品服務1.4 果蔬展示1.5 聯系我們1.6 商品具體信息1.7 登錄注冊 2.效果和源碼2.1 動態效果2.2 源代碼 源碼下載萬套模板&#xff0c;程序開發&#xff0c;在線開發&#xff0c;在線溝通 作者&#xff1a;xcLeigh 文章地址&#…

深入理解Java包裝類:自動裝箱拆箱與緩存池機制

深入理解Java包裝類&#xff1a;自動裝箱拆箱與緩存池機制 對象包裝器 Java中的數據類型可以分為兩類&#xff1a;基本類型和引用類型。作為一門面向對象編程語言&#xff0c; 一切皆對象是Java語言的設計理念之一。但基本類型不是對象&#xff0c;無法直接參與面向對象操作&…

uniapp自定義拖拽排列

uniapp自定義拖拽排列并改變下標 <!-- 頁面模板 --> <template><view class"container"><view v-for"(item, index) in list" :key"item.id" class"drag-item" :style"{transform: translate(${activeInde…

基于SpringBoot的課程管理系統

前言 今天給大家分享一個基于SpringBoot的課程管理系統。 1 系統介紹 課程管理系統是一種專門為學校設計的軟件系統&#xff0c;旨在幫助學校高效地管理和組織各類課程信息。 該系統通常包括學生、教師和管理員三大角色。 他們可以通過系統進行選課、查看課程表、考試、進…

max31865典型電路

PT100讀取有很多種方案&#xff0c;常用的惠斯通電橋&#xff0c;和專用IC max31865 。 電阻溫度檢測器(RTD)是一種阻值隨溫度變化的電阻。鉑是最常見、精度最高的測溫金屬絲材料。鉑RTD稱為PT-RTD&#xff0c;鎳、銅和其它金屬亦可用來制造RTD。RTD具有較寬的測溫范圍&#x…

飛算 JavaAI 與 Spring Boot:如何實現微服務開發效率翻倍?

微服務架構憑借其高內聚、低耦合的特性&#xff0c;成為企業構建復雜應用系統的首選方案。然而&#xff0c;傳統微服務開發流程中&#xff0c;從服務拆分、接口設計到代碼編寫、調試部署&#xff0c;往往需要耗費大量時間與人力成本。Spring Boot 作為 Java 領域最受歡迎的微服…

(2)Docker 常用命令

文章目錄 Docker 服務器Docker 鏡像Docker 容器本地 RegistryRUN vs CMD vs ENTRYPOINTRUNCMDENTRYPOINT 限制容器對內存、CPU 和 IO 資源的使用內存CPUBlock IO設置權重bps 和 iops cgroup 和 namespacecgroupnamespacMount namespaceUTS namespaceIPC namespacePID namespace…

Django 實現電影推薦系統:從搭建到功能完善(附源碼)

前言&#xff1a;本文將詳細介紹如何使用 Django 構建一個電影推薦系統&#xff0c;涵蓋項目的搭建、數據庫設計、視圖函數編寫、模板渲染以及用戶認證等多個方面。&#x1f517;軟件安裝、環境準備 ? 【作者主頁—&#x1f4da;閱讀更多優質文章、獲取更多優質源碼】 目錄 一…

C#進階學習(七)常見的泛型數據結構類(2)HashSet和SortedSet

目錄 using System.Collections.Generic; // 核心命名空間 一、 HashSet 核心特性 常用方法 屬性 二、SortedSet 核心特性 1、整型&#xff08;int、long 等&#xff09; 2、字符串型&#xff08;string&#xff09; 3、字符型&#xff08;char&#xff09; 4、自定義…

SQL之DML(查詢語句:select、where)

&#x1f3af; 本文專欄&#xff1a;MySQL深入淺出 &#x1f680; 作者主頁&#xff1a;小度愛學習 select查詢語句 在開發中&#xff0c;查詢語句是使用最多&#xff0c;也是CRUD中&#xff0c;復雜度最高的sql語句。 查詢的語法結構 select *|字段1 [, 字段2 ……] from 表…

vue | 不同 vue 版本對復雜泛型的支持情況 · vue3.2 VS vue3.5

省流總結&#xff1a;defineProps 的泛型能力&#xff0c;來直接推導第三方組件的 props 類型 引入第三方庫的類型&#xff0c;并直接在 <script setup> 中作為 props 使用。這種類型一般是復雜泛型&#xff08;包含聯合類型、可選屬性、交叉類型、條件類型等&#xff0…

Unity-無限滾動列表實現Timer時間管理實現

今天我們來做一個UI里經常做的東西&#xff1a;無限滾動列表。 首先我們得寫清楚實現的基本思路&#xff1a; 所謂的無限滾動當然不是真的無限滾動&#xff0c;我們只要把離開列表的框再丟到列表的后面就行&#xff0c;核心理念和對象池是類似的。 我們來一點一點實現&#x…

Docker的基本概念和一些運用場景

Docker 是一種開源的容器化平臺&#xff0c;可以幫助開發人員更加高效地打包、發布和運行應用程序。以下是 Docker 的基本概念和優勢&#xff1a; 基本概念&#xff1a; 容器&#xff1a;Docker 使用容器來打包應用程序及其依賴項&#xff0c;容器是一個獨立且可移植的運行環境…

Unity中基于第三方插件擴展的對于文件流處理的工具腳本

在Unity的項目中對應文件處理,在很多地方用到,常見的功能,就是保存文件,加載文件,判斷文件或者文件夾是否存在,刪除文件等。 在之前已經寫過通過C#的IO實現的這些功能,可查看《Unity C# 使用IO流對文件的常用操作》,但是不能保證所有平臺都可以使用 現在基于第三方跨…

Flink介紹——實時計算核心論文之MillWheel論文詳解

引入 通過前面的文章&#xff0c;我們從S4到Storm&#xff0c;再到Storm結合Kafka成為當時的實時處理最佳實踐&#xff1a; S4論文詳解S4論文總結Storm論文詳解Storm論文總結Kafka論文詳解Kafka論文總結 然而KafkaStorm的第一代流式數據處理組合&#xff0c;還面臨的三個核心…

python異步協程async調用過程圖解

1.背景&#xff1a; 項目中有用到協程&#xff0c;但是對于協程&#xff0c;線程&#xff0c;進程的區別還不是特別了解&#xff0c;所以用圖示的方式畫了出來&#xff0c;用于理清三者的概念。 2.概念理解&#xff1a; 2.1協程&#xff0c;線程&#xff0c;進程包含關系 一…

【React】獲取元素距離頁面頂部的距離

文章目錄 代碼實現 代碼實現 import { useEffect, useRef, useState } from react;const DynamicPositionTracker () > {const [distance, setDistance] useState(0);const divRef useRef(null);useEffect(() > {const targetDiv divRef.current;if (!targetDiv) re…