【开发板试用】cJSON的使用

HarryP0tter
发布于 2020-12-9 21:56
浏览
2收藏

源码包含第三方的cJSON库,在目录//third_party/cJSON,默认已经编译进固件。我们可以使用它的api,轻松的生成、解析json字符串。下面用一个例子记录cJSON的使用方法。

 

json的格式

首先一个花括号{},整个代表一个对象,同时里面是一种Key-Value的存储形式,它还有不同的数据类型来区分。

数据结构:Object、Array

基本类型:string,number,true,false,null

(1)Object

{key:value,key:value...}

key:string类型

value:任何基本类型或数据结构

(2)Array

[value,value...]

value:任何基本类型或数据结构。

比如:{"name":"李广", "values":[1,2,45,"你好"] }

生成json字符串

1)生成字符串样例:

 {                                                            
        "id":   123,                                                            
        "dp":   {                                                               
                "temperature":  [{                                              
                                "v":    23.5                                    
                        }],                                                     
                "humidity":     [{                                              
                                "v":    60.3                                    
                        }]                                                      
        }                                                                       

2)创建对象root,根据实际需要,从外到内一层一层添加所需的对象、数据、元素等;

    cJSON *root, *array1, *array2, *object1, *object2, *object3;
    root = cJSON_CreateObject();
    cJSON_AddItemToObject(root, "id", cJSON_CreateNumber(123));
    cJSON_AddItemToObject(root, "dp", object1 = cJSON_CreateObject());
    
    cJSON_AddItemToObject(object1, "temperature", array1 = cJSON_CreateArray());
    cJSON_AddItemToArray(array1, object2 = cJSON_CreateObject());
    cJSON_AddNumberToObject(object2, "v", 23.5);
    
    cJSON_AddItemToObject(object1, "humidity", array2 = cJSON_CreateArray());
    cJSON_AddItemToArray(array2, object3 = cJSON_CreateObject());
    cJSON_AddNumberToObject(object3, "v", 60.3);

3)创建完成,调用函数打印生成的json字符串;

    char *out = cJSON_Print(root);
    printf(" %s \n", out);

4)最后,释放掉内存;调用cJSON_Delete(root),其余子节点申请的内存会一并释放掉。

    if(out)
    {
        free(out);
    }   
    if(root)
    {
        cJSON_Delete(root);
    }

解析json字符串

1)从外到内一层一层解析json字符串,伪代码如下;

    cJSON *root, *item, *obj, *obj1, *array;
    root = cJSON_Parse(str);
   
    item = cJSON_GetObjectItem(root, "id");
    printf("id=%d\n", item->valueint);

    obj = cJSON_GetObjectItem(root, "dp");
    array = cJSON_GetObjectItem(obj, "temperature");
    int size = cJSON_GetArraySize(array);
    int i;
    for(i=0;i<size;i++)
    {
        obj1 = cJSON_GetArrayItem(array, i);
        if(obj1)
        {
            item = cJSON_GetObjectItem(obj1, "v");
            if(item)
            {
                printf("v=%0.1lf\n", item->valuedouble);
            }
        }
    }

    array = cJSON_GetObjectItem(obj, "humidity");
    size = cJSON_GetArraySize(array);
    for(i=0;i<size;i++)
    {
        obj1 = cJSON_GetArrayItem(array, i);
        if(obj1)
        {
            item = cJSON_GetObjectItem(obj1, "v");
            if(item)
            {
                printf("v=%0.1lf\n", item->valuedouble);
            }
        }
    }

2)记得释放内存;

    if(root)
    {
        cJSON_Delete(root);
    }

3)程序运行,生成、解析json字符串打印如下;

【开发板试用】cJSON的使用-鸿蒙开发者社区

【开发板试用】cJSON的使用-鸿蒙开发者社区

分类
已于2020-12-9 21:56:01修改
4
收藏 2
回复
举报
6条回复
按时间正序
/
按时间倒序
charlesc
charlesc

搭配示例讲解直观多了

回复
2020-12-10 10:42:49
卫斯理
卫斯理

楼主好久不见呀 终于等到更新了

回复
2020-12-10 10:56:55
鸿蒙开发者社区官方账号
鸿蒙开发者社区官方账号

征文大赛正在火热进行中,楼主这么优秀的文章真的不考虑参加吗?

 

例如这篇在标题开头添加“#2020征文-开发板#“,
再找到相应的专栏位置投稿,

就可以参加比赛啦!

 

详细步骤可以点击链接https://harmonyos.51cto.com/posts/1940进行了解

用更多的文章来赢取更多的奖励和人气吧!期待楼主后续的活跃表现。

回复
2020-12-10 14:10:49
HarryP0tter
HarryP0tter 回复了 卫斯理
楼主好久不见呀 终于等到更新了

最近加班有点多o(╥﹏╥)o

回复
2020-12-10 18:08:39
鲜橙加冰
鲜橙加冰

楼主,你已经有资格开自己的专栏了。把相关文章都收录进去吧。

回复
2020-12-10 19:19:21
HarryP0tter
HarryP0tter 回复了 鲜橙加冰
楼主,你已经有资格开自己的专栏了。把相关文章都收录进去吧。

已创建,欢迎指正。

回复
2020-12-10 21:09:52
回复
    相关推荐