当前位置: 首页 > backend >正文

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.xdnf.cn/news/12452.html

相关文章:

  • linux系统dd 工具介绍
  • 理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
  • win10+TensorRT+OpenCV+Qt+YOLOV8模型部署教程
  • 2025年多层PCB技术发展与厂商实践指南
  • C++总复习
  • 嵌入式学习笔记 - FreeRTOS 信号量以及释放函数
  • cursor和windsurf使用体验对比
  • NLP学习路线图(二十八):BERT及其变体
  • AI for Science(AI4S)的现在与未来,科学智能如何赋能科学研究?
  • Python训练营打卡Day46(2025.6.6)
  • leetcode 2434. 使用机器人打印字典序最小的字符串 中等
  • SpringCloud学习笔记-2
  • 【idea】分享一个关于Maven依赖管理好用的插件
  • 【redis实战篇】第八天
  • pyinstaller打包遇到报错,和pathlib冲突
  • KAG与RAG在医疗人工智能系统中的多维对比分析
  • Python读取阿里法拍网的html+解决登录cookie
  • 第四讲:类和对象(下)
  • 视觉SLAM基础补盲
  • git提交代码和解决冲突修复bug
  • MongoDB学习和应用(高效的非关系型数据库)
  • 【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程
  • 使用 Windows 完成 iOS 应用上架:Appuploader对比其他证书与上传方案
  • 在Linux查看电脑的GPU型号
  • 【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
  • 超构光学与 AR 的深度融合 | 攻克 VAC 与眼动范围难题
  • DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
  • 完美搭建appium自动化环境
  • 解决Zotero翻译插件Zotero PDF Translate无法正常翻译
  • C# 快速检测 PDF 是否加密,并验证正确密码