jobszheng5 发表于 2023-11-1 17:35

[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>

wang12011201 发表于 2023-11-1 18:28

<p>氡jsongо</p>

wang12011201 发表于 2023-11-1 18:28

<p>оRAM</p>

lugl4313820 发表于 2023-11-1 20:18

<p>我有个解析,总是解析不出数据,可以帮我看看吗?</p>

<p>&nbsp; 代码如下:</p>

<p>void Proscess(void* data)</p>

<p>{</p>

<p>printf(&quot;Start parsing JSON data&quot;);</p>

<p>cJSON *root,*json_name,*json_temp_num,*json_hum_num;</p>

<p>root = cJSON_Parse((char*)data); ////解析成json形式</p>

<p>&nbsp;</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>&nbsp;</p>

<p>printf(&quot;name:%s\n temp_num:%f\n hum_num:%f\n&quot;,</p>

<p>json_name-&gt;valuestring,</p>

<p>json_temp_num-&gt;valuestring,</p>

<p>json_hum_num-&gt;valuestring);</p>

<p>&nbsp;</p>

<p>cJSON_Delete(root); //释放内存</p>

<p>}</p>

<p>&nbsp;</p>

damiaa 发表于 2023-11-2 09:25

<p>printf(&quot;name:%s\n temp_num:%f\n hum_num:%f\n&quot;,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; json_name-&gt;valuestring,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; json_temp_num-&gt;valuestring,</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; json_hum_num-&gt;valuestring);</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>类型不匹配</p>

jobszheng5 发表于 2023-11-2 10:08

lugl4313820 发表于 2023-11-1 20:18
我有个解析,总是解析不出数据,可以帮我看看吗?

&nbsp; 代码如下:

void Proscess(void* data)

...

<p>如楼上所言,printf的输出格式不一致。</p>

<p>TEMP,HUM与NAME是一样的,都是字符串,即均使用了双引号引用起来了。</p>

jobszheng5 发表于 2023-11-2 10:08

lugl4313820 发表于 2023-11-1 20:18
我有个解析,总是解析不出数据,可以帮我看看吗?

&nbsp; 代码如下:

void Proscess(void* data)

...

<p>我之前在linux系统下也使用的是cJSON库。</p>

lugl4313820 发表于 2023-11-2 10:19

damiaa 发表于 2023-11-2 09:25
printf(&quot;name:%s\n temp_num:%f\n hum_num:%f\n&quot;,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs ...

<p>好的,我回去再试试,感觉大佬的解答。</p>

lemonboard 发表于 2023-11-2 10:28

<p>cJSON会不会也是先开一大块RAM空间,再操作其字符串啊?</p>
页: [1]
查看完整版本: [STM32F769IDISCO返场]移植JSON协议库