在STM32F407上简单移植Cjson

       现在的生活离不开网络,作为底层开发大军中小小的一员,不可避免遇到需要将底层采集到的数据通过网络发送给服务器进行分析展现,问题来了,,以什么可是将数据打包上去呢!!

      基于两方开发的便捷,最终选择了CJSON。。。网上资料也挺全,很多同行们都用过,有经验可参考。

      移植需要准备的东西不多,下载一个压缩包:

                                                                               链接:https://github.com/DaveGamble/cJSON

 

    只需要将其中的cJSON.c/cJSON.h添加到自己的工程之中去。

 

                                                                

char *packJSON(void)//cJSON打包
{
   cJSON *root,*staj,*desj,*repj;//cJSON指针
   char *out;
   root=cJSON_CreateObject();//创建root对象,返回值为cJSON指针
   staj=cJSON_CreateObject();
   desj=cJSON_CreateObject();
   repj=cJSON_CreateObject();
   cJSON_AddItemToObject(staj,"desired",desj);//向staj中添加一个对象desj
   cJSON_AddStringToObject(desj,"message","cJSON Test!");//向desj中添加一个字符串,键为“message”,键值为“cJSON Test!”
   cJSON_AddItemToObject(staj,"reported",repj);//向staj中添加一个对象repj
   cJSON_AddNumberToObject(repj,"int_data",9999);//向repj中添加一个整数,键为 “int_data”,键值为“9999”
   cJSON_AddNumberToObject(repj,"double_data",8.888);//向repj中添加一个浮点数,键为 “double_data”,键值为“8.888”
   cJSON_AddItemToObject(root,"state",staj);//向root中添加一个对象staj
   cJSON_AddNumberToObject(root,"version",4321);//向root中添加一个整数,键为 “version”,键值为“4321”
   out=cJSON_Print(root);//将root转换为普通字符串,并返回指针
   cJSON_Delete(root);//释放内存
   mymfree_cjson(out);
   return out;
}

                                                                          

   参考了N多大神的文章,做一个简单的测试:

void Establish_test(void)
{
   char *packtext;
   char parsetext[]=
   {"{\n"
   "\"state\":{\n"
   "\"desired\":{\n"
   "\"message\":\"Hello,cJSON!\"\n"
   "},\n"
   "\"reported\":{\n"
   "\"int_data\":1999,\n"
   "\"double_data\":6.666\n"
   "}\n"
   "},\n"
   "\"version\":1234\n"
   "}\n"};   
   printf("\n\r");
   parseJSON(parsetext);

   packtext=packJSON();
   parseJSON(packtext);   
}

 

void parseJSON(char *text)//cJSON解析
{
   int jversion=0;
   int jint_data=0;
   char *out=NULL;
   char *jmessage=NULL;
   double jdouble_data=0;
   
   //cJSON指针定义
   cJSON *json=NULL;
   cJSON *jver=NULL,*jsta=NULL;
   cJSON *jdes=NULL,*jrep=NULL;
   cJSON *jmes=NULL,*jint=NULL,*jdou=NULL;
   
   json=cJSON_Parse(text);
   if(!json)
   {
      printf("Error before:[%s]\n\r",cJSON_GetErrorPtr());
   }else
   {
      out=cJSON_Print(json);
      printf("%s\n",out);
      out=cJSON_PrintUnformatted(json);
      printf("%s\n",out);
      
      /*get the version of the json*/
      jver=cJSON_GetObjectItem(json,"version");//获取JSON格式中,键值为“version”的对象
      jversion=jver->valueint;
      printf("(1)version:%d\n",jversion);
      
      jsta=cJSON_GetObjectItem(json,"state");
      jdes=cJSON_GetObjectItem(jsta,"desired");
      jmes=cJSON_GetObjectItem(jdes,"message");
      jmessage=jmes->valuestring;
      printf("(2)The message of desired in state is :%s\n\r",jmessage);
      
      
      jrep=cJSON_GetObjectItem(jsta,"reported");
      jint=cJSON_GetObjectItem(jrep,"int_data");
      jdou=cJSON_GetObjectItem(jrep,"double_data");
      jint_data=jint->valueint;
      jdouble_data=jdou->valuedouble;
      printf("(3)int_data= %d,double_data= %f \n\r",jint_data,jdouble_data);
      
      cJSON_Delete(json);
      myfree_cjson(out);
   }
}

    下载验证多次,总是打印不出Json格式数据包,最终在大神的指导下,改了一下STM32F407的启动文件:

                                                                             

     Stack_Size(栈)以及 Heap_Size(堆)的大小,编译测试后可打印出数据包。

     下期更新--------上传服务器后的测试结果。如果有什么问题,忘大神指点,谢谢!!!!!

注:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值