ESP32上C語言實現JSON對象的創建和解析

在ESP32上使用C語言實現JSON對象的創建和解析,同樣可以借助cJSON庫。ESP-IDF(Espressif IoT Development Framework)本身已經集成了cJSON庫,你可以直接使用。以下是詳細的步驟和示例代碼。

1. 創建一個新的ESP-IDF項目

首先,確保你已經安裝了ESP-IDF開發環境。然后使用以下命令創建一個新的項目:

idf.py create-project esp32_json_example
cd esp32_json_example

2. 編寫JSON對象創建代碼

下面的代碼展示了如何在ESP32上創建一個JSON對象并將其轉換為字符串:

#include <stdio.h>
#include "cJSON.h"void app_main()
{// 創建一個JSON對象cJSON *root = cJSON_CreateObject();// 添加一個字符串字段cJSON_AddStringToObject(root, "name", "Alice");// 添加一個整數字段cJSON_AddNumberToObject(root, "age", 25);// 創建一個嵌套的JSON對象cJSON *contact = cJSON_CreateObject();cJSON_AddStringToObject(contact, "email", "alice@example.com");cJSON_AddStringToObject(contact, "phone", "+1234567890");// 將嵌套的JSON對象添加到根對象中cJSON_AddItemToObject(root, "contact", contact);// 將JSON對象轉換為字符串char *json_string = cJSON_Print(root);if (json_string != NULL) {printf("Generated JSON: %s\n", json_string);cJSON_free(json_string);}// 釋放JSON對象的內存cJSON_Delete(root);
}

代碼解釋:

  • 使用cJSON_CreateObject()創建一個根JSON對象。
  • 使用cJSON_AddStringToObject()cJSON_AddNumberToObject()向根對象中添加字符串和數字字段。
  • 創建一個嵌套的JSON對象contact,并向其中添加emailphone字段。
  • 將嵌套對象添加到根對象中。
  • 使用cJSON_Print()將JSON對象轉換為字符串,并打印輸出。
  • 最后,釋放JSON字符串和JSON對象的內存。

3. 編寫JSON對象解析代碼

下面的代碼展示了如何在ESP32上解析一個JSON字符串:

#include <stdio.h>
#include "cJSON.h"void app_main()
{const char *json_str = "{\"name\": \"Bob\", \"age\": 32, \"contact\": {\"email\": \"bob@example.com\", \"phone\": \"+0987654321\"}}";// 解析JSON字符串cJSON *root = cJSON_Parse(json_str);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "Error before: %s\n", error_ptr);}return;}// 獲取JSON字段的值cJSON *name = cJSON_GetObjectItemCaseSensitive(root, "name");cJSON *age = cJSON_GetObjectItemCaseSensitive(root, "age");cJSON *contact = cJSON_GetObjectItemCaseSensitive(root, "contact");if (cJSON_IsString(name) && cJSON_IsNumber(age) && cJSON_IsObject(contact)) {printf("Name: %s\n", name->valuestring);printf("Age: %d\n", age->valueint);cJSON *email = cJSON_GetObjectItemCaseSensitive(contact, "email");cJSON *phone = cJSON_GetObjectItemCaseSensitive(contact, "phone");if (cJSON_IsString(email) && cJSON_IsString(phone)) {printf("Contact:\n");printf("  Email: %s\n", email->valuestring);printf("  Phone: %s\n", phone->valuestring);}}// 釋放JSON對象的內存cJSON_Delete(root);
}

代碼解釋:

  • 定義一個JSON字符串json_str
  • 使用cJSON_Parse()解析JSON字符串。
  • 使用cJSON_GetObjectItemCaseSensitive()獲取JSON字段的值。
  • 檢查字段的類型,并打印輸出。
  • 最后,釋放JSON對象的內存。

4. 編譯和燒錄

在項目目錄下,使用以下命令編譯和燒錄代碼:

idf.py set-target esp32
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor

請將/dev/ttyUSB0替換為你的ESP32設備對應的串口設備名稱。

5. 注意事項

  • 在ESP32上使用cJSON時,要注意內存管理,避免內存泄漏。
  • 如果JSON數據較大,要確保有足夠的內存來存儲和處理。

通過以上步驟,你就可以在ESP32上實現JSON對象的創建和解析。

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

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

相關文章

【FAQ】PCoIP 會話后物理工作站本地顯示器黑屏

# 問題 工作人員從家里建立了到辦公室工作站的 PCoIP 連接&#xff0c;該工作站安裝了 HP Anyware Graphics Agent&#xff0c;并且還連接了本地顯示器。然后&#xff0c;遠程用戶決定去辦公室進行本地工作&#xff0c;工作站顯示器顯示黑屏&#xff08;有時沒有信號&#xff…

el-table 目錄樹列表本地實現模糊查詢

table目錄樹結構實現模糊查詢 <el-form :model"queryParams" ref"queryForm" size"small" :inline"true" v-show"showSearch"><el-form-item label"名稱:" prop"Name"><el-input v-mode…

力扣hot100 LeetCode 熱題 100 Java 哈希篇

兩數之和 1. 兩數之和 - 力扣&#xff08;LeetCode&#xff09; 直接暴力 class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){long ans nums[i]nums[j];if(ans>target)continue;if(anstarg…

前后端部署

#在學習JavaWeb之后&#xff0c;進行了蒼穹外賣的學習。在進行蒼穹外賣的部署的時候&#xff0c;作者遇到了下面的問題# 1.前端工程nginx無法啟動&#xff1a; 當我雙擊已經部署好的nginx工程中nginx.exe文件的時候&#xff0c;在服務中&#xff0c;并沒有找到ngnix成功運行。…

基于 EFISH-SBC-RK3588 的無人機環境感知與數據采集方案

一、核心硬件架構設計? ?高性能算力引擎&#xff08;RK3588 處理器&#xff09;? ?異構計算架構?&#xff1a;集成 8 核 CPU&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;支持動態調頻與多任務并行處理&#xff0c;單線程性能較傳統四核方案…

什么是Maven

Maven的概念 Maven是一個一鍵式的自動化的構建工具。Maven 是 Apache 軟件基金會組織維護的一款自動化構建工具&#xff0c;專注服務于Java 平臺的項目構建和依賴管理。Maven 這個單詞的本意是&#xff1a;專家&#xff0c;內行。Maven 是目前最流行的自動化構建工具&#xff0…

mongo客戶端操作mongodb記錄

背景&#xff1a; 長時間不操作mongodb數據庫&#xff0c;已經遺忘了命令&#xff0c;今天正好用到&#xff0c;溫習一下 直接上命令 #進入mongodb數據庫安裝bin目錄cd /opt/mongodb/bin#連接mongodb ./mongo #查看所有的數據庫 show dbs; #選擇數據庫 use xx; #查看表 show …

rocky9.4部署k8s群集v1.28.2版本(containerd)(純命令)

文章目錄 前言三個節點的主機名 所有節點操作主機名和ip解析關閉交換分區&#xff0c;關閉防火墻&#xff0c;關閉selinux更換阿里云yum源時間同步修改內核參數修改系統最大打開文件數開啟bridge網橋過濾&#xff0c;加載br_netfilter模塊&#xff0c;加載配置文件安裝ipset及i…

解析塔能科技:綠色低碳智慧節能一站式破局之匙

在能源問題日益凸顯的當下&#xff0c;綠色低碳、高效節能成為全球發展的重要課題。對各類節能方案進行深入剖析后&#xff0c;可以發現塔能科技的綠色低碳智慧節能一站式解決方案極具創新性與實用性&#xff0c;切實為眾多行業面臨的能源困境提供了有效解決路徑。 直面行業痛點…

精選面試題

1、js中set和map的作用和區別? 在 JavaScript 中&#xff0c;Set 和 Map 是兩種非常重要的集合類型 1、Set 是一種集合數據結構&#xff0c;用于存儲唯一值。它類似于數組&#xff0c;但成員的值都是唯一的&#xff0c;沒有重復的值。Set 中的值只能是唯一的&#xff0c;任何…

Flutter之路由和導航

目錄&#xff1a; 1、flutter路由和導航簡介2、路由的使用2.1、使用 Navigator2.2、使用命名路由2.3、使用路由器 3、應用中添加Tab導航4、頁面跳轉一個新頁面和回退5、傳遞數據到新頁面6、使用 RouteSettings 傳遞參數 1、flutter路由和導航簡介 Flutter 提供了一個完整的系統…

KMS工作原理及其安全性分析

在當今數字化時代&#xff0c;數據安全已經成為企業和個人最為關注的話題之一。隨著云計算和大數據的快速發展&#xff0c;如何安全地管理密鑰成為了一個重要的挑戰。KMS&#xff08;Key Management Service&#xff0c;密鑰管理服務&#xff09;作為一種專業的密鑰管理解決方案…

機器學習在網絡安全中的應用:守護數字世界的防線

一、引言 隨著信息技術的飛速發展&#xff0c;網絡安全問題日益凸顯&#xff0c;成為全球關注的焦點。傳統的網絡安全防護手段&#xff0c;如防火墻、入侵檢測系統&#xff08;IDS&#xff09;和防病毒軟件&#xff0c;雖然在一定程度上能夠抵御攻擊&#xff0c;但在面對復雜多…

Java在excel中導出動態曲線圖DEMO

1、環境 JDK8 POI 5.2.3 Springboot2.7 2、DEMO pom <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>commons…

Android APP 爬蟲操作

工具 夜神模擬器、charles、mitm 等 mitm的使用參考:Mitmproxy對Android進行抓包&#xff08;真機&#xff09;_mitmproxy 安卓-CSDN博客 charles的使用參考&#xff1a;【全網最詳細】手把手教學Charles抓包工具詳細自學教程&#xff0c;完整版安裝教程&#xff0c;詳細介紹…

Redis的LFU策略具體怎么工作?

Redis的LFU&#xff08;Least Frequently Used&#xff09;策略通過動態跟蹤鍵的訪問頻率實現淘汰決策&#xff0c;其核心工作邏輯可分為以下四個部分&#xff1a; 數據結構設計? 字段拆分?&#xff1a;每個Redis對象&#xff08;redisObject&#xff09;的lru字段&#xff…

Redis 及其在系統設計中的作用

什么是Redis Redis 是一個開源的內存數據結構存儲系統&#xff0c;可用作數據庫、緩存和消息代理。它因其快速的性能、靈活性和易用性而得到廣泛應用。 Redis 數據存儲類型 Redis 允許開發人員以各種數據結構&#xff08;例如字符串、位圖、位域、哈希、列表、集合、有序集合…

MySQL:如何用關系型數據庫征服NoSQL核心戰場?

寫在前面&#xff1a;當SQL遇見NoSQL的十年之變 2012年MongoDB掀起文檔數據庫革命時&#xff0c;開發者們不得不在靈活性與事務一致性之間做痛苦抉擇。十年后的今天&#xff0c;MySQL 8.0的JSON功能已實現&#xff1a; ? 二進制存儲效率超越傳統BLOB 40% ? 多值索引使JSON查…

Dart Flutter數據類型詳解 int double String bool list Map

目錄 字符串的幾種方式 bool值的判斷 List的定義方式 Map的定義方式 Dart判斷數據類型 (is 關鍵詞來判斷類型) Dart的數據類型詳解 int double String bool list Map 常用數據類型: Numbers(數值): int double Strings(字符串) String Booleans(布爾…

win11中wsl在自定義位置安裝ubuntu20.04 + ROS Noetic

wsl的安裝 環境自定義位置安裝指定ubuntu版本VsCodeROS備份與重載備份重新導入 常用命令參考文章 環境 搜索 啟用或關閉 Windows 功能 勾選這2個功能&#xff0c;然后重啟 自定義位置安裝指定ubuntu版本 從網上找到你所需要的相關wsl ubuntu版本的安裝包&#xff0c;一般直…