嵌入式的数据交换格式Json——CJson

举报
o0龙龙0o 发表于 2021/06/16 21:19:50 2021/06/16
【摘要】 物联网中JSON--CJSON,利用C语言下的Json进行数据的交互,更加方便的和利于构建和解析。

Json是常用语互联网的数据传输格式,在网页和后台中常常被使用,物联网领域也是最常用的,在使用NB的一些领域(对流量要求没那么高的)也会使用Json格式,这次来讲讲物联网嵌入式使用的Json—CJson,LiteOS在是使用MQTT和PC交互时,常常使用的就是Cjson文件格式

1、Json是啥

JSON(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。
JSON数据格式与语言无关。即便它源自JavaScript,但目前很多编程语言都支持; JSON格式数据的生成和解析。

2、JSON的基本数据类型:

  • 数值:十进制数,不能有前导0,可以为负数,可以有小数部分。还可以用e或者E表示指数部分。不能包含非数,如NaN。不区分整数与浮点数。JavaScript用双精度浮点数表示所有数值。
  • 字符串:以双引号""括起来的零个或多个Unicode码位。支持反斜杠开始的转义字符序列。
  • 布尔值:表示为true或者false。
  • 值的有序列表(array):有序的零个或者多个值。每个值可以为任意类型。序列表使用方括号[,]括起来。元素之间用逗号,分割。形如:[value, value]
  • 对象(object):若干无序的“键-值对”(key-value pairs),其中键是数值或字符串。建议但不强制要求对象中的键是独一无二的。对象以花括号{开始,并以}结束。键-值对之间使用逗号分隔。键与值之间用冒号:分割。
  • null类型:值写为null。

3、Json的应用

  • web开发:Json 防范应用于JavaScrpt、Java、Node.Js应用上,在PHP和C#开发WEB应用可开始已经有使用,仅次于XML的应用
  • NoSQL数据库:NoSQL数据库一般也用JSON格式才存储数据。

4、Json存储格式

[
     {
          "text": "This is the text",
          "color": "dark_red",
          "bold": "true",
          "strikethough": "true",
          "clickEvent":
               {
                    "action": "open_url",
                    "value": "zh.wikipedia.org"
               },
          "hoverEvent":
               {
                    "action": "show_text",
                    "value":
                    {
                         "extra": "something"
                    }
               }
     },
     {
          "translate": "item.dirt.name",
          "color": "blue",
          "italic": "true"
     }
]

用【】、{}字段:数据 的形式保存数据,既方便读取,也方便了解析。

5、CJson是什么呢?

cJSON是使用C语言编写,用来创建、解析JSON文件的库。cJSON特点就是工程文件简单,提供函数接口功能全,麻雀虽小五脏俱全,使用起来也很方便。

LiteOS的Cjson解析文件的目录是

LiteOS/ components / lib / cjson / cJSON-1.7.14

这里LiteOS使用的开源的cJson解析器,遵照Dave Gamble (original author)的设计和使用

6、CJson的解析数据结构和API

  1. cJSON核心结构体
    /* The cJSON structure: */
    typedef struct cJSON {
            struct cJSON *next,*prev;       /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
            struct cJSON *child;            /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
            struct cJSON *parent;   /* parent tracing */
            const char**  vars;
            int type;                                       /* The type of the item, as above. */
    
            char *decvalstring;   /* decoded string of this item */
            char *valuestring;                      /* The item's string, if type==cJSON_String */
            int valueint;                           /* The item's number, if type==cJSON_Number */
            double valuedouble;                     /* The item's number, if type==cJSON_Number */
    
            char *string;                           /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    } cJSON;
  2. 解析函数
    cJSON *cJSON_Parse(const char *value);
    
    按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体
  3. 获取指定字段内得值
    cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
  4. 将CJons数据格式转换成Json字符串
    char  *cJSON_Print(cJSON *item);
  5. 后去Json数组格式对象的数量
    int	  cJSON_GetArraySize(cJSON *array);

7、LiteOS编译CJSON

LiteOS编译CJOSN需要

CJSON_VERSION = cJSON-1.7.14

COMPONENTS_CJSON_INCLUDE = \
    -I $(LITEOSTOPDIR)/components/lib/cjson/$(CJSON_VERSION)

将解析构建文件包含到系统中,然后就是用上面的API了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200