以下是一個基于 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);}
}
代碼解釋
- 引入頭文件:引入了?
stdio.h
、string.h
、esp_log.h
?和?cJSON.h
?頭文件,分別用于標準輸入輸出、字符串處理、ESP - IDF 日志和 JSON 處理。 - 創建 JSON 數據:
create_json_data()
?函數創建一個新的 JSON 對象,并添加鍵值對。然后將 JSON 對象轉換為字符串并返回。 - 解析 JSON 數據:
parse_json_data()
?函數解析傳入的 JSON 字符串,并讀取其中的鍵值對。最后打印出讀取到的值。 - 主函數:在?
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 鍵值對數據,你可以根據實際情況選擇最合適的方法。