单片机C语言JSON数据处理

一、JSON开发思路

最近有个项目使用JSON数据和上位机进行通讯,我将开发历程分享给大家。起初我想用MDK自带的JSON库,编译也没问题,但最后发现该库对编译器有要求,不是很方便,最后我放弃了这条思路,用网上下载的JSON C代码写功能函数,最后所有功能都实现了。所以我强烈推荐大家采用这种开发思路,代码都是用C语言写的,看的见摸不着。

二、我对JSON代码的理解

2.1关于JSON的格式

{
    "CMD":    4,
    "DeviceType":    1,
    "Control":    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
}


首先先上一段代码。这就是JSON代码的基本格式。用大括号包括一个JSON代码。代码包中包括很多的节点,节点类型有INT型,string型,double型。这是三种基本类型。除了基本类型可以是JSON节点,矩阵节点。这有点类似于C语言的数据类型,不光有基本类型还有组合类型。

接下来我们看看JSON的数据格式:

/* The cJSON structure: */
typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *next;
    struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
    struct cJSON *child;

    /* The type of the item, as above. */
    int type;

    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    /* The item's number, if type==cJSON_Number */
    double valuedouble;

    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    char *string;
} cJSON;

看到这是不是就基本明白JSON是咋回事了。首先是他的名字就是char *string;定义的内容。

他的类型由 int type来定义,然后就是三种基本的数据。除了基本的数据类型外还可以是组合数据类型包括可以是完整的JSON结构体和矩阵数据类型,这就类似于C语言的基本数据类型和组合数据类型。看来很多东西都是想通的。

2.2关于如何使用

该部分从两个角度来说这个问题:分别是如何解析和如何打包。针对每一个功能实现下面进行详细解析

2.2.1如何创建一个JSON

cJSON *json_p_rd, *tmp1,*tmp2,*tmp3,*tmp4,*tmp5,*tmp6,*tmp7;
tmp3=cJSON_CreateObject();	
json_p_rd=cJSON_Parse(text);

从上面的代码就可以看明白如何创建和解析一个JSON数据结构体了。其中的text是JSON 数据的字符串。

2.2.2如何增加JSON节点

cJSON_AddNumberToObject(tmp3,"CMD",1);
cJSON_AddStringToObject(tmp3, "OperateString", "The Cmd Error !");
cJSON_AddItemToObject(tmp6,"OperateValue", tmp7=cJSON_CreateArray( ));	

可以通过上面的函数增加节点

2.2.3如何获得一个节点

 node = cJSON_GetObjectItem(json_p_rd,"Control");	
 if((tmp3 !=NULL) && (tmp->type==cJSON_Number))
 {
    dat1=tmp3;

}

上面的代码就可以获得一个节点。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

憨憨的老郭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值