JSON解析接口-C

JSON解析接口-C

c 复制代码
#include <stdio.h>
#include <string.h>

#define uint8_t unsigned char
#define uint32_t unsigned int
#define uint16_t unsigned short


//根据实际模块来
#define REV_D  "+IPD"  
#define FUN_PAR_OVERFLOW 0xff
//将数组/指针中为0x00的字段全部变成空格号
void buf_clear_0(uint8_t *data, uint8_t lenth)
{
	int i=0;
	for(i=0; i<lenth; i++ )
	{
		if(data[i] == '\0')
		{
			data[i] = ' ';
		}
	}	
}
//查询字符在字符串位置函数
uint8_t find_char_len(uint8_t *str, uint8_t c,uint16_t len)
{
	int i=0;
	for(i=0; i<len; i++)
	{
		if(str[i] == c)
		{
			return i;
		}
	}
    
    printf("FUN_PAR_OVERFLOW \r\n");
	return FUN_PAR_OVERFLOW;
}
//解析命令数据
/*
cmd :解析的命令, 
data:原数据,
rev_data:解析得到的数组 
rev_data_len:数组长度
blank_on:json字段是否有空格
str_on:是否是字符串(有双引号就是字符串)
*/
uint8_t decode_cmd_data(uint8_t *cmd, uint8_t * data, uint8_t* rev_data,int rev_data_len, uint8_t blank_on, uint8_t str_on)
{
    char * tar_str=NULL;
	int cmd_len=0;
    char blank_len=2;
    uint32_t val;
    
    //如果没有空格
    if(blank_on == 1)
    {
        blank_len++; 
    }
    if(str_on == 1)
    {
       blank_len++; 
    }
    
    tar_str  = (char *)strstr((char *)data, cmd);
	if(tar_str != NULL)
	{
		tar_str = &tar_str[strlen(cmd) + blank_len];
        
        //字符串
        if(str_on == 1)
        {
            cmd_len = find_char_len((uint8_t *)tar_str,'"',rev_data_len);
            if(cmd_len == FUN_PAR_OVERFLOW)
            {    
                return ;
            }
            memcpy(rev_data,tar_str,cmd_len); 
            
        }
        else
        {
            val = atoi(tar_str);
            memcpy(rev_data,&val,4); 

        }
        //printf("ok\r\n");
        return 1; //成功
	}
    else
    {
        printf("err\r\n");
        return 0; //失败
    }
   
}

//解析json-解析命令
void decode_cmd(uint8_t *data)
{
    uint8_t file_name[50]={0};
    uint8_t file_ver[20]={0};
    uint8_t file_size[20]={0};
    uint8_t file_checksum[64]={0};
    uint32_t dat_num=0;
    
    if(strstr(data,"START_UPGRADE"))
    {
        //printf("have dat\r\n");
        //printf("%s\r\n",data);
        decode_cmd_data("file_name",data,file_name,sizeof(file_name),1,1);
        decode_cmd_data("version",data,file_ver,sizeof(file_ver),1,1);
        decode_cmd_data("file_size",data,file_size,sizeof(file_size),1,1);
        decode_cmd_data("checksum_check",data,file_checksum,sizeof(file_checksum),1,1);
        decode_cmd_data("data_num",data,&dat_num,sizeof(dat_num),0,0);
    }
    
    printf("file_name: %s\r\n", file_name);
    printf("version: %s\r\n", file_ver);
    printf("file_size: %s\r\n", file_size);
    printf("checksum_check: %s\r\n", file_checksum);
    printf("dat_num:%d\r\n", dat_num);
    
}
//解析json-初步解析
void decode_json(uint8_t * data)
{
    uint8_t *str;
    str  = strstr(data,REV_D);
    
    if(str != NULL)
    {
        buf_clear_0(str,15);
        decode_cmd(str);
    }
}

char buf[] = "+IPD: receive:WBS-MYD-V10-00000001\
{\
    \"cmd\": \"START_UPGRADE\",\
    \"data\": {\
	    \"version\": \"1.0\",\
        \"file_name\": \"V1.0.0.bin\",\
    	\"file_size\": \"128537\",\
    	\"checksum_check\": \"67f3b40ba0cbb7d289a9cf6f3f75e6c319f12bdc82d5c35\",\
        \"data_num\":132466\
    }\
}";

int main()
{

    decode_json(buf);
	return 0;

}
相关推荐
江畔柳前堤5 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
wuyk5555 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
Forever Nore6 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考7 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX8 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面8 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号9 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽9 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI9 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
C++ 老炮儿的技术栈10 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio