JSON解析崩潰原因及解決方案

問題記錄:

/************************************************|
* 描述:     將ID124執行NFC操作-JSON解析為結構體* 函數名:  cJSON_ID124_to_struct* 參數[ I]: *json_string   待解析的指針* 參數[II]: *wireless_rxd  結構體指針* 返回:     成功返回0 	    失敗返回-1************************************************/
int cJSON_ID124_to_struct(const char *json_string, WIRELESS_RXD *wireless_rxd) 
{if (!json_string || !wireless_rxd) {#ifdef DEBUGprintf("Invalid input parameters\n");#endifreturn -1;}cJSON *root = cJSON_Parse(json_string);if (!root) {#ifdef DEBUGprintf("JSON parse error: [%s]\n", cJSON_GetErrorPtr());#endifreturn -1;}cJSON *object = cJSON_GetObjectItem(root, "124");if (!object) {#ifdef DEBUGprintf("Missing '124' object\n");#endifcJSON_Delete(root);return -1;}// 解析NFC操作類型 (必需字段)cJSON *item = cJSON_GetObjectItem(object, "1");if (!item) {#ifdef DEBUGprintf("Missing or invalid '1' field (NFC action)\n");#endifcJSON_Delete(root);return -1;}wireless_rxd->NfcAction.nfc_action = item->valueint;// 如果不是添加實體卡操作,則解析卡IDif (wireless_rxd->NfcAction.nfc_action != NFC_ADD_ENTITY) {item = cJSON_GetObjectItem(object, "2");if (!item) {#ifdef DEBUGprintf("Missing or invalid '2' field (NFC ID)\n");#endifcJSON_Delete(root);return -1;}wireless_rxd->NfcAction.nfcID = (uint32_t)(item->valuedouble);}// 解析用戶ID (必需字段)item = cJSON_GetObjectItem(object, "4");if (!item) {#ifdef DEBUGprintf("Missing or invalid '4' field (user ID)\n");#endifcJSON_Delete(root);return -1;}wireless_rxd->NfcAction.userId = item->valueint;/*更新備份值*/if (RTC_BKP10 != wireless_rxd->NfcAction.userId) {RTC_BKP10 = wireless_rxd->NfcAction.userId;}cJSON_Delete(root);return 0;
}/*函數解析多次json_string={"124":{"1":4,"2":3012238756,"4":134}}后陷入奔潰*/

函數在多次解析相同的 JSON 字符串?{"124":{"1":4,"2":3012238756,"4":134}}?后會崩潰并返回 "JSON parse error",這可能有以下幾個原因:

可能的原因

  1. 內存泄漏

    • 每次調用?cJSON_Parse()?都會分配內存,雖然調用了?cJSON_Delete(root),但可能在多次調用后仍然有內存未被正確釋放。

  2. 多線程問題

    • 如果此函數在多線程環境中被調用,而 cJSON 不是線程安全的,可能會導致問題。

  3. 浮點數精度問題

    • 使用?item->valuedouble?來讀取 NFC ID,但將其強制轉換為 uint32_t,對于大整數可能會有精度問題。

  4. 輸入字符串被修改

    • 原始 JSON 字符串可能在解析過程中被其他代碼修改。

  5. cJSON 庫內部狀態問題

    • 某些 cJSON 版本可能有內部狀態管理問題。

解決方案建議

  1. 添加更詳細的錯誤日志

    #ifdef DEBUG
    printf("JSON string to parse: %s\n", json_string);
    const char *error_ptr = cJSON_GetErrorPtr();
    if (error_ptr) {printf("Error before: %s\n", error_ptr);
    }
    #endif
  2. 檢查輸入字符串有效性

    if (!json_string || strlen(json_string) == 0) {#ifdef DEBUGprintf("Empty or NULL JSON string\n");#endifreturn -1;
    }
  3. 修改 NFC ID 解析方式

    // 改為使用字符串形式讀取大整數,避免精度問題
    item = cJSON_GetObjectItem(object, "2");
    if (item && item->valuestring) {wireless_rxd->NfcAction.nfcID = (uint32_t)strtoul(item->valuestring, NULL, 10);
    } else if (item) {wireless_rxd->NfcAction.nfcID = (uint32_t)item->valueint;
    } else {// 錯誤處理
    }
  4. 確保線程安全

    • 如果多線程使用,添加互斥鎖保護 cJSON 解析過程。

  5. 檢查內存使用

    • 使用內存檢測工具檢查是否有內存泄漏。

  6. 驗證 cJSON 版本

    • 確保使用的是最新穩定的 cJSON 版本。

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

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

相關文章

業務系統對接大模型的基礎方案:架構設計與關鍵步驟

業務系統對接大模型:架構設計與關鍵步驟 在當今數字化轉型的浪潮中,大語言模型(LLM)已成為企業提升業務效率和創新能力的關鍵技術之一。將大模型集成到業務系統中,不僅可以優化用戶體驗,還能為業務決策提供…

Edge(Bing)自動領積分腳本部署——基于python和Selenium(附源碼)

微軟的 Microsoft Rewards 計劃可以通過 Bing 搜索賺取積分,積分可以兌換禮品卡、游戲等。每天的搜索任務不多,我們可以用腳本自動完成,提高效率,解放雙手。 本文將手把手教你如何部署一個自動刷積分腳本,并解釋其背…

前端基礎之《Vue(19)—狀態管理》

一、什么是狀態管理 1、Vue版本問題 Vue2 Vuex3 Vue3 Vuex4 / Pinia2 在使用任何技術的時候,都先要去搜索一下版本,你的版本和腳手架環境是否兼容。 2、安裝Vuex yarn add vuex3.6.2 3、狀態管理 狀態,在應用程序中表示數據&#xff0c…

【圖像處理基石】如何進行圖像畸變校正?

圖像畸變校正常用于計算機視覺、攝影測量學和機器人導航等領域,能夠修正因鏡頭光學特性或傳感器排列問題導致的圖像失真。下面我將介紹幾種常用的圖像畸變校正算法,并提供Python實現和測試用例。 常用算法及Python實現 1. 徑向畸變校正 徑向畸變是最常…

藍橋杯_DS18B20溫度傳感器---新手入門級別超級詳細解析

目錄 一、引言 DS18B20的原理圖 單總線簡介: ?編輯暫存器簡介: DS18B20的溫度轉換與讀取流程 二、代碼配置 maic文件 疑問 關于不同格式化輸出符號的使用 為什么要rd_temperature()/16.0? onewire.h文件 這個配置為什么要先讀lo…

MySQL的并發事務問題及事務隔離級別

一、并發事務問題 1). 贓讀:一個事務讀到另外一個事務還沒有提交的數據。 比如 B 讀取到了 A 未提交的數據。 2). 不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀。 事務 A 兩次讀取同一條記錄&…

密碼學基礎——SM4算法

博客主頁:christine-rr-CSDN博客 ????專欄主頁:密碼學 📌 【今日更新】📌 對稱密碼算法——SM4 目錄 一、國密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特點 2.3 基本部件 2.3.1 S盒 2.3.2 非線性變換 ?編輯…

練習:對象數組 4

定義數組存儲 4 個女朋友的對象。女朋友的屬性:姓名、年齡、性別、愛好;要求1:計算出四個女朋友的平均年齡;要求2:統計年齡比平均值低的女朋友有幾個?并把他們的所有信息打印出來。 代碼: //對…

React Hooks 基礎指南

React Hooks 是 React 16.8 引入的重要特性,它允許開發者在函數組件中使用狀態和其他 React 特性。本文將詳細介紹 6 個最常用的 React Hooks。 1. useState useState 是最常用的 Hook,用于在函數組件中添加 state。 import React, { useState } from…

【Python 算法零基礎 4.排序 ⑥ 快速排序】

既有錦繡前程可奔赴,亦有往日歲月可回首 —— 25.5.25 選擇排序回顧 ① 遍歷數組:從索引 0 到 n-1(n 為數組長度)。 ② 每輪確定最小值:假設當前索引 i 為最小值索引 min_index。從 i1 到 n-1 遍歷,若找到…

處理git沒做修改,但是文件顯示變更的情況

使用 TortoiseGit(小烏龜 Git) 時遇到 “文件內容沒改,但顯示為變更,提示有 n 行刪除、n 行添加”,你可以按照以下步驟操作來排查并解決問題: ? 一、定位問題根源(是否為行尾差異)…

智慧貨運飛船多維度可視化管控系統

圖撲搭建智慧貨運飛船可視化系統,借數字孿生技術,高精度復刻貨運飛船外觀、結構與運行場景。整合多維度數據,實時呈現飛行狀態、設備參數等信息,助力直觀洞察貨運飛船運行邏輯,為航天運維、任務推演及決策提供數字化支…

maven微服務${revision}依賴打包無法識別

1、場景描述 我現在又一個微服務項目&#xff0c;父pom的版本&#xff0c;使用<properties>定義好&#xff0c;如下所示&#xff1a; <name>ypsx-finance-center</name> <artifactId>ypsx-finance</artifactId> <packaging>pom</pack…

詳解代理型RAG與MCP服務器集成

檢索增強型生成(RAG)將語言模型與外部知識檢索相結合,讓模型的回答基于最新的事實,而不僅僅是其訓練數據呢。 RAG(高級別) 在 RAG 流程中,用戶查詢用于搜索知識庫(通常通過向量數據庫中的嵌入來實現),并將檢索到的最相關文檔“增強”到模型的提示中,以幫助生成事實…

智能倉儲的未來:自動化、AI與數據分析如何重塑物流中心

當倉庫學會“思考”&#xff0c;物流的終極形態正在誕生 想象這樣的場景&#xff1a; 凌晨3點&#xff0c;某物流中心燈火通明卻空無一人。AGV機器人集群根據實時訂單動態規劃路徑&#xff1b;AI視覺系統在0.1秒內掃描包裹信息&#xff1b;數字孿生平臺正模擬次日峰值流量壓力…

如何防止服務器被用于僵尸網絡(Botnet)攻擊 ?

防止服務器被用于僵尸網絡&#xff08;Botnet&#xff09;攻擊是關鍵的網絡安全措施之一。僵尸網絡是黑客利用大量被感染的計算機、服務器或物聯網設備來發起攻擊的網絡。以下是關于如何防止服務器被用于僵尸網絡攻擊的技術文章&#xff1a; 防止服務器被用于僵尸網絡&#xff…

貪心算法應用:硬幣找零問題詳解

貪心算法與硬幣找零問題詳解 貪心算法&#xff08;Greedy Algorithm&#xff09;在解決優化問題時表現出簡潔高效的特點&#xff0c;尤其適用于特定結構的組合優化問題。本文將用2萬字篇幅&#xff0c;深入探討貪心算法在硬幣找零問題中的應用&#xff0c;覆蓋算法原理、正確性…

Java高級 | 【實驗一】Springboot安裝及測試 |最新

隸屬文章&#xff1a;Java高級 | &#xff08;二十二&#xff09;Java常用類庫-CSDN博客 目錄 一、SpringBoot的特點 二、Spring Boot安裝及測試 &#xff08;一&#xff09;安裝Intellij IDEA &#xff08;二&#xff09;安裝MySQL &#xff08;三&#xff09;安裝postma…

C# WPF 左右布局實現學習筆記(1)

開發流程視頻&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源碼&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF應用&#xff08;.NET Framework) 2.…

從零開始,學會上傳,更新,維護github倉庫

以下是一份從頭到尾、覆蓋安裝、配置、創建倉庫、上傳項目到 GitHub 的完整教程。全程使用通用示例&#xff0c;不包含任何具體的倉庫鏈接&#xff0c;僅供參考。 一、準備工作 1. 注冊 GitHub 賬號 打開瀏覽器&#xff0c;訪問 GitHub 官網&#xff08;輸入 “GitHub” 即可找…