[STM32F769IDISCO返场]移植JSON协议库
<div class='showpostmsg'># 移植JSON协议库今天给大家带来的是JSON协议库的移植。上午的时候下载了FreeRTOS实时操作系统的LTS版本,看到其数据包里包含了coreJSON库。想想如果让STM32F769做为一个执行器模块,其利用以太网传输数据肯定需要json协议格式的支持,于是下午就想着把它给移植到STM32F769上来!
移植过其实没有啥难度!本身coreJSON是以C语言编写,只有一个C文件和头文件,放到我们工程里面,声明一下头文件即可。我还以为要学习一段子呢!结果学习成本很低很低。
官方是这样评价这个JSON库的
> coreJSON 库提供了一个解析器,支持密钥查找,同时严格执行 ECMA-404:JSON 数据交换标准。 该库以 C 语言编写,符合 ISO C90 和 MISRA C:2012 标准。 经证明,此库可安全使用内存且不执行堆分配,适用于 IoT 微控制器,也可以完全移植到其他平台。
经过我移植,确实如其所言。
附上我的核心代码:
~~~c
JSONStatus_t result;
char buffer[] = "{\"admin\":{\"soso\":\"an excellent editor.\",\"nmg\":\"a positive person.\"},\"user\":{\"jobszheng5\":\"a senior engineer.\"}}";
size_t bufferLength = sizeof(buffer) - 1;
char query[] = "user.jobszheng5";
size_t queryLength = sizeof(query) - 1;
char *value;
size_t valueLength;
result = JSON_Validate(buffer, bufferLength);
if (result == JSONSuccess)
{
result = JSON_Search(buffer, bufferLength, query, queryLength,
&value, &valueLength);
}
if (result == JSONSuccess)
{
char save = value;
value = '\0';
JDEBUG_PRINTF("Found: %s -> %s\n", query, value);
// Restore the original character.
value = save;
}
~~~
再看看结果,嗯!符合预期^_^
文章最后,给大家一个关于JSON的普及内容
> JSON,全称JavaScript ObjectNotation,是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。它基于JavaScript的子集,语法比XML更简洁,更易于阅读和编写。JSON使用JavaScript语法的子集来表示各种数据类型,包括数字、字符串、布尔值、数组和对象。
>
> JSON的对象表示为花括号{},数组表示为方括号[]。键值对表示为"键":值,键和值之间用冒号分隔。字符串必须用双引号括起来,而数字、布尔值和null则不需要。
>
> JSON的优点包括:
>
> 1. 简洁的语法:相比XML,JSON的语法更简洁,更易于阅读和编写。
> 2. 易于解析:JSON可以使用各种编程语言中的库或内置函数轻松解析。
> 3. 跨平台:JSON是跨平台的,可以在不同的操作系统和语言中使用。
> 4. 高效的传输:JSON数据可以在网络中进行高效传输,减少了数据传输的时间和带宽。
>
> 总之,JSON是一种常用的数据交换格式,适用于不同编程语言之间的数据交换和存储。</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>氡jsongо</p>
<p>оRAM</p>
<p>我有个解析,总是解析不出数据,可以帮我看看吗?</p>
<p> 代码如下:</p>
<p>void Proscess(void* data)</p>
<p>{</p>
<p>printf("Start parsing JSON data");</p>
<p>cJSON *root,*json_name,*json_temp_num,*json_hum_num;</p>
<p>root = cJSON_Parse((char*)data); ////解析成json形式</p>
<p> </p>
<p>json_name = cJSON_GetObjectItem( root , NAME); //获取键值内容</p>
<p>json_temp_num = cJSON_GetObjectItem( root , TEMP_NUM );</p>
<p>json_hum_num = cJSON_GetObjectItem( root , HUM_NUM );</p>
<p> </p>
<p>printf("name:%s\n temp_num:%f\n hum_num:%f\n",</p>
<p>json_name->valuestring,</p>
<p>json_temp_num->valuestring,</p>
<p>json_hum_num->valuestring);</p>
<p> </p>
<p>cJSON_Delete(root); //释放内存</p>
<p>}</p>
<p> </p>
<p>printf("name:%s\n temp_num:%f\n hum_num:%f\n",</p>
<p> json_name->valuestring,</p>
<p> json_temp_num->valuestring,</p>
<p> json_hum_num->valuestring);</p>
<p> </p>
<p> </p>
<p>类型不匹配</p>
lugl4313820 发表于 2023-11-1 20:18
我有个解析,总是解析不出数据,可以帮我看看吗?
代码如下:
void Proscess(void* data)
...
<p>如楼上所言,printf的输出格式不一致。</p>
<p>TEMP,HUM与NAME是一样的,都是字符串,即均使用了双引号引用起来了。</p>
lugl4313820 发表于 2023-11-1 20:18
我有个解析,总是解析不出数据,可以帮我看看吗?
代码如下:
void Proscess(void* data)
...
<p>我之前在linux系统下也使用的是cJSON库。</p>
damiaa 发表于 2023-11-2 09:25
printf("name:%s\n temp_num:%f\n hum_num:%f\n",
&nbs ...
<p>好的,我回去再试试,感觉大佬的解答。</p>
<p>cJSON会不会也是先开一大块RAM空间,再操作其字符串啊?</p>
页:
[1]