CentOS 7 使用cJSON 库

什么是JSON

JSON是一种轻量级的数据交换格式,可读性强、编写简单。键值对组合编写规则,键名使用双引号包裹,冒号:分隔符后面紧跟着数值,有两种常用的数据类型是对象和数组。

对象:使用花括号{}包裹起来的内容,数据结构{"key1": "value1", "key2":"value2" ...},key为对象的属性,value为对象的值。

数值:使用中括号[]包裹起来的内容,数据结构{"key": ["value1", "value2", "value3" ...]}。

CentOS 7 安装cJSON 库

cJSON Github 地址:https://github.com/DaveGamble/cJSON

步骤1:首先,你需要下载cJSON的源代码。你可以从https://github.com/DaveGamble/cJSON或者源代码官方网站下载。并上传至/usr/local/source_code/

步骤2:下载完成后,需要将源代码解压,可以使用以下命令:

[root@localhost source_code]# tar -zxvf cJSON-1.7.15.tar.gz

步骤3:解压后,切换到源代码目录:

[root@localhost source_code]# cd cJSON-1.7.15

步骤4:生成cJSON动态/静态库,执行如下指令:

[root@localhost cJSON-1.7.15]# mkdir build
[root@localhost cJSON-1.7.15]# cd build/
[root@localhost build]# cmake ..
CMake Deprecation Warning at CMakeLists.txt:2 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- The C compiler identification is GNU 8.3.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
******
[root@localhost build]# make && make install
[  2%] Building C object CMakeFiles/cjson.dir/cJSON.c.o
[  4%] Linking C shared library libcjson.so
[  4%] Built target cjson
[  6%] Building C object CMakeFiles/cJSON_test.dir/test.c.o
[  8%] Linking C executable cJSON_test
[  8%] Built target cJSON_test
[ 11%] Building C object tests/CMakeFiles/unity.dir/unity/src/unity.c.o
[ 13%] Linking C static library libunity.a
[ 13%] Built target unity
[ 15%] Building C object tests/CMakeFiles/print_number.dir/print_number.c.o
[ 17%] Linking C executable print_number
-- 省略--
[100%] Built target fuzz_main
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/include/cjson/cJSON.h
-- Installing: /usr/local/lib64/pkgconfig/libcjson.pc
-- Installing: /usr/local/lib64/libcjson.so.1.7.15
-- Installing: /usr/local/lib64/libcjson.so.1
-- Installing: /usr/local/lib64/libcjson.so
-- Installing: /usr/local/lib64/cmake/cJSON/cjson.cmake
-- Installing: /usr/local/lib64/cmake/cJSON/cjson-noconfig.cmake
-- Installing: /usr/local/lib64/cmake/cJSON/cJSONConfig.cmake
-- Installing: /usr/local/lib64/cmake/cJSON/cJSONConfigVersion.cmake

遇到的问题及解决办法

编译执行./test_cjson,提示如下截图错误信息:

[root@localhost cJSON_demo]# ./test_cjson
./test_cjson: error while loading shared libraries: libcjson.so.1: cannot open shared object file: No such file or directory

从报错的原因上看,本机上没有找到cJOSN类库的静态库/动态库libcjson.so。

首先检查/usr/local/lib 和/usr/local/include 目录中是否包含cjson 静态或动态库,可以执行如下指令:

ls /usr/local/lib | grep cjson
ls /usr/local/include | grep cjson

从上面分组 查询结果可知:cjson 没有在/usr/local/lib 库中生成cjson 静态/动态库链接。

再次查看cJOSN 在执行make && make install 指令时,对应cJSON 静态/动态库生成链接存放目录地址。

从上述截图可知cJSON 静态/动态库被安装到了/usr/local/lib64 目录中。

将/usr/local/lib64 目录添加至本机静态/动态库链接目录文件中,执行如下指令:

[root@localhost cJSON_demo]# cat /etc/ld.so.conf.d/usr-libs.conf
/usr/local/lib
[root@localhost cJSON_demo]# vi /etc/ld.so.conf.d/usr-libs.conf
[root@localhost ~]#  cat /etc/ld.so.conf.d/usr-libs.conf
/usr/local/lib
/usr/local/lib64
[root@localhost cJSON_demo]# sudo ldconfig

再次编译执行./test_cjson, Main 函数正确输出。

cJSON快速入门

在/usr/local/source_code 新增 cJSON_demo目录并新增test_cjson.c 文件,文件内容如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cjson/cJSON.h>

int main()
{
    cJSON *json = NULL;
    cJSON *node = NULL;
    cJSON *tnode = NULL;
    cJSON *tnode2 = NULL;
    char *json_data = NULL;
    int i, j, size, size2;

    char *data = "{\"serialNumber\":\"212089842348362300\", \
                   \"cellularInfo\":\
                      [\
                           {\"name\":\"ethernet0/0/1\",\
                           \"switch\":\"0\"},\
                           {\"name\":\"ethernet0/0/2\",\
                           \"switch\":\"1\"},\
                           {\"name\":\"ethernet0/0/3\",\
                           \"switch\":\"0\"}\
                       ],\
                       \"family\":[\"father\",\"mother\",\"brother\",\"sister\",\"somebody\"]\
                   }";

    json = cJSON_Parse(data);
    json_data = cJSON_Print(json);
    printf("data: %s\n", json_data);
    free(json_data);

    node = cJSON_GetObjectItem(json,"serialNumber");
    if(node == NULL)
        printf("serialNumber: no\n");
    else
        printf("serialNumber: ok\n");

    node = cJSON_GetObjectItem(json, "family");
    if (node == NULL)
         printf("family: no\n");
     else
         printf("family: ok\n");
     if (node->type == cJSON_Array)
    {
        printf("family array size is %d\n", cJSON_GetArraySize(node));

        size = cJSON_GetArraySize(node);
        for (i=0; i<size; i++)
        {
            tnode = cJSON_GetArrayItem(node, i);

            if (tnode->type == cJSON_String)
                printf("%d: %s\n", i, tnode->valuestring);
            else
                printf("node type is not string, value = %d\n", tnode->type);
          }
    }

    node = cJSON_GetObjectItem(json, "cellularInfo");
    if(node == NULL)
         printf("cellularInfo: no\n");
     else
         printf("cellularInfo: ok\n");
    if (node->type == cJSON_Array)
    {
        printf("cellularInfo array size is %d\n", cJSON_GetArraySize(node));

        size = cJSON_GetArraySize(node);
        for (i=0; i<size; i++)
        {
            tnode = cJSON_GetArrayItem(node, i);

            if (tnode->type == cJSON_String)
                printf("%d: %s\n", i, tnode->valuestring);
            else if (tnode->type == cJSON_Object)
            {
                size2 = cJSON_GetArraySize(tnode);
                for (j=0; j<size2; j++)
                {
                    tnode2 = cJSON_GetArrayItem(tnode, j);
                    if (tnode2->type == cJSON_String)
                        printf("%d-%d: %s\n", i, j, tnode2->valuestring);
                    else
                        printf("tnod2 type is err\n");
                 }
             }
             else
                printf("node type is not string, value = %d\n", tnode->type);
          }
     }

    cJSON_Delete(json);

    return 0;
}

编译源码并执行:

[root@localhost cJSON_demo]# gcc -o test_cjson test_cjson.c -lcjson
[root@localhost cJSON_demo]# ./test_cjson
data: {
        "serialNumber": "212089842348362300",
        "cellularInfo": [{
                        "name": "ethernet0/0/1",
                        "switch":       "0"
                }, {
                        "name": "ethernet0/0/2",
                        "switch":       "1"
                }, {
                        "name": "ethernet0/0/3",
                        "switch":       "0"
                }],
        "family":       ["father", "mother", "brother", "sister", "somebody"]
}
serialNumber: ok
family: ok
family array size is 5
0: father
1: mother
2: brother
3: sister
4: somebody
cellularInfo: ok
cellularInfo array size is 3
0-0: ethernet0/0/1
0-1: 0
1-0: ethernet0/0/2
1-1: 1
2-0: ethernet0/0/3
2-1: 0

cJSON 参考资料

cJSON Github 官网地址:https://github.com/DaveGamble/cJSON

cJSON 开发参考: https://zhuanlan.zhihu.com/p/55095477?utm_oi=892471685738024960

相关推荐
tjjingpan18 分钟前
在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档
linux·pdf
苹果醋324 分钟前
Vue3响应式数据: 深入分析Ref与Reactive
java·运维·spring boot·mysql·nginx
hope_wisdom39 分钟前
Linux系统编程之目录遍历
linux·linux编程·readdir·目录遍历·scandir
人类群星闪耀时1 小时前
利用AI进行系统性能优化:智能运维的新时代
运维·人工智能·性能优化
小安运维日记1 小时前
CKA认证 | Day7 K8s存储
运维·云原生·容器·kubernetes·云计算
LinuxSuRen1 小时前
Jenkins 命令行多线程并发下载制品包
运维·jenkins
存储服务专家StorageExpert1 小时前
墙裂推荐:console, CLI命令行和日志使用字体-Cascadia
运维·服务器·netapp存储·存储维护·emc存储
暗碳1 小时前
华为麦芒5(安卓6)termux记录 使用ddns-go,alist
android·linux
靡樊1 小时前
Linux:基础IO
linux
菜鸟康2 小时前
Linux系统编程——理解系统内核中的信号捕获
linux·运维·服务器