JSON解析崩溃原因及解决方案

news2025/6/9 19:36:25

问题记录:

/************************************************|
* 描述:     将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 DEBUG
        printf("Invalid input parameters\n");
        #endif
        return -1;
    }

    cJSON *root = cJSON_Parse(json_string);
    if (!root) {
        #ifdef DEBUG
        printf("JSON parse error: [%s]\n", cJSON_GetErrorPtr());
        #endif
        return -1;
    }

    cJSON *object = cJSON_GetObjectItem(root, "124");
    if (!object) {
        #ifdef DEBUG
        printf("Missing '124' object\n");
        #endif
        cJSON_Delete(root);
        return -1;
    }

    // 解析NFC操作类型 (必需字段)
    cJSON *item = cJSON_GetObjectItem(object, "1");
    if (!item) {
        #ifdef DEBUG
        printf("Missing or invalid '1' field (NFC action)\n");
        #endif
        cJSON_Delete(root);
        return -1;
    }
    wireless_rxd->NfcAction.nfc_action = item->valueint;

    // 如果不是添加实体卡操作,则解析卡ID
    if (wireless_rxd->NfcAction.nfc_action != NFC_ADD_ENTITY) {
        item = cJSON_GetObjectItem(object, "2");
        if (!item) {
            #ifdef DEBUG
            printf("Missing or invalid '2' field (NFC ID)\n");
            #endif
            cJSON_Delete(root);
            return -1;
        }
        wireless_rxd->NfcAction.nfcID = (uint32_t)(item->valuedouble);
    }

    // 解析用户ID (必需字段)
    item = cJSON_GetObjectItem(object, "4");
    if (!item) {
        #ifdef DEBUG
        printf("Missing or invalid '4' field (user ID)\n");
        #endif
        cJSON_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 DEBUG
        printf("Empty or NULL JSON string\n");
        #endif
        return -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.coloradmin.cn/o/2405756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI技术路线急转:从TypeScript到Rust的Codex CLI重构内幕

目录 前言:OpenAI的技术抉择引发业界思考 Codex CLI:OpenAI的终端AI编程利器 语言抉择的戏剧性反转:从TypeScript到Rust Rust重写的四大技术动因 1. 零依赖部署:消除环境配置痛点 2. 内存安全与沙箱隔离 3. 性能的全面碾压 …

window下配置ssh免密登录服务器

window下配置ssh免密登录服务器 本地windows远程登录我的ssh服务器10.10.101.xx服务器,想要每次都免密登录这个服务器. 记录下教程,防止后期忘记,指导我实现这个过程。 教程 二、实践步骤:Windows 上配置 SSH 免密登录 2.1 确…

nginx部署

配置阿里云yum源 安装如下编译工具 yum install -y gcc gcc-c autoconf automake make #安装使用nginx还得安装nginx所需的一些第三方系统库的支持,比如nginx的静态资源压缩功能所需的gzip lib库,nginx需要支持URL重写,所需的pcre库&…

线性规划饮食问题求解:FastAPI作为服务端+libhv作为客户端实现

之前在 Pyomo介绍-CSDN博客 中介绍过通过Pyomo求解线性规划问题,这里使用FastAPI作为服务端,开源网络库libhv作为客户端,求解饮食成本最小化问题。 服务端测试代码test_fastapi_pyomo_server.py如下: from fastapi import FastAP…

前端验证下跨域问题(npm验证)

文章目录 一、背景二、效果展示三、代码展示3.1)index.html3.2)package.json3.3) service.js3.4)service2.js 四、使用说明4.1)安装依赖4.2)启动服务器4.3)访问前端页面 五、跨域解决方案说明六…

Linux Docker的简介

参考资料 30分钟Docker入门教程 ◀ 本篇博客所有图片皆来自于该视频截图阮一峰 - Docker 入门教程 目录 一. 环境配置时可能会遇到的问题二. 什么是Docker三. 虚拟机 与 Docker 的区别3.1 虚拟机3.2 Docker 四. Docker的基本架构五. Dockerfile 一. 环境配置时可能会遇到的问题…

极昆仑智慧与数元灵科技达成战略合作

近日,北京极昆仑智慧科技有限公司与北京数元灵科技有限公司正式签署产品级融合战略合作协议,双方将围绕 "AIBI商业智能分析" " Hybrid RAG 大模型问答" 等核心大模型应用,实现技术架构与业务场景的深度集成,…

第四讲:类和对象(下)

1. 再探构造函数 • 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表&#xff…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Dad Jokes(冷笑话卡片)

📅 我们继续 50 个小项目挑战!—— DadJokes 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 豆包翻译确实可以,冷笑话应该属于各类语言比较难理解的…

Spring AOP执行原理源码解析

对【com.example.demo.TestAspect#aopTest】连接点增加了五个通知 在调用【com.example.demo.A#testAop()】(用户自定义)方法时,Cglib拦截器对其进行了拦截 可以看到执行顺序分别是环绕前置,前置,环绕后置,…

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。

基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升,对水资源管理和水位监测的需求…

在Windows下利用LoongArch-toolchain交叉编译Qt

文章目录 0.交叉编译的必要性1.下载交叉编译工具链1.1.直接在Windows下使用mingw(不使用虚拟机)编译(还没成功,无法编译)1.2.在虚拟机中的Ubuntu中进行交叉编译 2.下载qt源码3.编译Qt3.1.创建loongarch64的mkspec3.2.创…

AIRIOT无人机安防解决方案

随着无人机技术的飞速发展和广泛应用,其在安防领域的价值日益凸显,从关键设施巡检、大型活动安保到边境巡防、应急救援,无人机正成为立体化安防体系不可或缺的“空中哨兵”。然而,无人机安防应用蓬勃发展的同时,其自身…

华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

php apache构建 Web 服务器

虚拟机配置流程winsever2016配置Apache、Mysql、php_windows server 2016配置web服务器-CSDN博客 PHP 和 Apache 通过 ​​模块化协作​​ 共同构建 Web 服务器&#xff0c;以下是它们的交互机制和工作流程&#xff1a; ​​一、核心组件分工​​ 组件角色​​Apache​​Web …

打通印染车间“神经末梢”:DeviceNet转Ethernet/IP连接机器人的高效方案

在印染行业自动化升级中&#xff0c;设备联网需求迫切。老旧印染设备多采用Devicenet协议&#xff0c;而新型工业机器人普遍支持Ethernet/IP协议&#xff0c;协议不兼容导致数据交互困难&#xff0c;设备协同效率低、生产监控滞后&#xff0c;成了行业数字化转型的阻碍。本文将…

2025-06-02-IP 地址规划及案例分析

IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中&#xff0c;MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层&#xff0c;二者协…

AUTOSAR实战教程--开放式通用DoIP刷写工具OpenOTA开发计划

目录 软件概述 安装与运行 界面说明 3.1 功能区划分 3.2 状态显示 基本操作流程 4.1 DoIP连接配置 4.2 服务配置&#xff08;刷写流程&#xff09; 4.3 执行操作 4.4 保存配置 4.5 加载配置 功能详解 5.1 核心功能模块 诊断服务配置 通信设置 文件下载 工具功…

AI赋能的浏览器自动化:Playwright MCP安装配置与实操案例

以下是对Playwright MCP的简单介绍&#xff1a; Playwright MCP 是一个基于 Playwright 的 MCP 工具&#xff0c;提供浏览器自动化功能不要求视觉模型支持&#xff0c;普通的文本大语言模型就可以通过结构化数据与网页交互支持多种浏览器操作&#xff0c;包括截图、点击、拖动…

【技术笔记】MSYS2 指定 Python 版本安装方案

#工作记录 MSYS2 指定 Python 版本安装 一、前置条件 安装指定版本需要在干净的 MSYS2 环境中执行&#xff0c;为保证工具链的兼容性&#xff0c;若已安装 Python&#xff0c;需先卸载 Python 及与该版本深度绑定的工具链。具体操作如下&#xff1a; 卸载 Python&#xff1a…