zhange 发表于 2024-5-24 06:50:37

stc32使用cjosn记录贴

本帖最后由 zhange 于 2024-5-25 15:41 编辑

最近学到iic了,想驱动12864屏做个天气预报,通过8266可以获取去到天气数据,但是都是json格式,听人说可以用下cjosn,现学现用。





结束了没成功以后成功了再来   

在visual studio里边测试的好好的为啥移动到keil不行了

在visual studio里运行结果

zhange 发表于 2024-5-24 06:56:33

1.下载cjson压缩包


里边只用到了

cJSON.c
cJSON.h





v1.7.18版本



zhange 发表于 2024-5-24 07:51:48

二:JSON语法规则

[*]json对象是一个无序的"名称值"键值对的集合,以"{"开始,以"}"结束,
[*]允许嵌套使用 每个名称和值成对出现,名称和值之间使用":"分隔; 键值对之间用","分隔
[*]在这些字符前后允许存在无意义的空白符;



对于键值,可以有如下值

[*]一个新的json对象
[*]数组使用"[“和"]"表示
[*]数字直接表示,可以是整数,也可以是浮点数
[*]字符串:使用引号"表示
[*]字面值:false、nul、true中的一个(必须是小写)



zhange 发表于 2024-5-24 07:58:45

本帖最后由 zhange 于 2024-5-24 08:28 编辑

三:基本流程
1.创建cJSON指针
2.解析整段json数据,返回cJSON指针
3.根据键值对的名称从链表中取出对应的值,返回该键值对的地址
4.根据类型提取相关值
5.释放

zhange 发表于 2024-5-24 08:33:00

全是英文,英语差了耽误学习呀

parse
分解;解析

[例句]        the student's ability to parse a sentence
学生解析句子的能力

zhange 发表于 2024-5-24 08:35:22

四:初次尝试


#include "cJSON.h"
#include "stdio.h"




int main ()
{
      const char* data = { "{\"results\":0000,\"xingbie\":\"nan\"}" };
      //1.创建cJSON指针
      cJSON * ceshi = NULL;
      //2.解析整段数据, 返回指针
      
      ceshi = cJSON_Parse (data);
      if (!ceshi)
      {
                printf ("error:%s",cJSON_GetErrorPtr());
      }
      else
      {
                printf ("解析成功");
                //3.根据键值对的名称从链表中取出对应的值,返回该键值对的地址
                cJSON* jsonXingbie = cJSON_GetObjectItem (ceshi, "xingbie");
                //4.根据类型提取相关值
                if (jsonXingbie->type == cJSON_String)
                {
                        printf ("%s", jsonXingbie->valuestring);
                }

      }
      //5.释放
      cJSON_Delete (ceshi);
      return 0;
}

zhange 发表于 2024-5-24 09:21:36

五:了解解析常用的几个函数



cJSON_Parse(const char *value);


解析json,解析不成功返回NULL。

cJSON_GetObjectItem(const cJSON * const object, const char * const string)


如果指定键存在于 JSON 对象中,就返回对应的值;如果不存在,则返回 NULL。


/* These functions check the type of an item */
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);


判断cJSON的存储的类型



cJSON_Delete (ceshi);


释放

在使用 cJSON 时,记得及时释放分配的内存以避免内存泄漏。

soma 发表于 2024-5-24 12:43:36

json物联网用的蛮多的

zhange 发表于 2024-5-24 16:45:40

soma 发表于 2024-5-24 12:43
json物联网用的蛮多的

碎片化时间学习    我又来了{:5_309:}

zhange 发表于 2024-5-24 16:46:12

soma 发表于 2024-5-24 12:43
json物联网用的蛮多的

关键是有的api8266还不能连接上    。。。。
页: [1] 2
查看完整版本: stc32使用cjosn记录贴