cJSON
1.1、cJSON简介
是什么 ?:ultra-lightweight JSON parser library.
开发语言:C89
源码仓库:https://github.com/DaveGamble/cJSON
1.2、cJSON的使用

step1、创建一个项目目录,并进入该目录

mkdir cJSONTest && cd cJSONTest

step2、使用curl命令将cJSON.hcJSON.c两个文件下载到cJSONTest目录中

curl -LO https://raw.githubusercontent.com/DaveGamble/cJSON/master/cJSON.h
curl -LO https://raw.githubusercontent.com/DaveGamble/cJSON/master/cJSON.c

step3、编写一个C语言源程序cJSONTest.c,其内容如下

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include"cJSON.h"

int main(int argc, char *argv[]) {
    const char *json = "{\
                            \"name\":\"fpliu\",\
                            \"age\": 18,\
                            \"height\": 180.0,\
                            \"isMale\": true,\
                            \"images\": [\
                                \"1.jpg\", \
                                \"2.png\"\
                            ]\
                        }";
    cJSON *cJSONRoot = cJSON_Parse(json);
    if(NULL != cJSONRoot) {
        cJSON * child = cJSONRoot->child;
        while(NULL != child) {
            int type = child->type;
            char *valueStr = NULL;
            if (cJSON_String == type) {
                valueStr = child->valuestring;
            } else if(cJSON_Number == type) {
                double value = child->valuedouble;
                valueStr = cJSON_PrintUnformatted(child);
            } else if(cJSON_Array == type) {
                valueStr = cJSON_PrintUnformatted(child);
                int count = cJSON_GetArraySize(child);
                for(int i= 0; i < count; i++) {
                    cJSON *arrayItem = cJSON_GetArrayItem(child, i);
                    //递归
                }
            } else if(cJSON_True == type) {
                //TODO
                valueStr = cJSON_PrintUnformatted(child);
            } else if(cJSON_False == type) {
                //TODO
                valueStr = cJSON_PrintUnformatted(child);
            } else {
                valueStr = cJSON_PrintUnformatted(child);
            }

            int length = strlen(child->string) + strlen(valueStr) + 2;
            char tmp[length];
            memset(tmp, 0, length);
            sprintf(tmp, "%s=%s", child->string, valueStr);

            printf("%s\n", tmp);

            child = child->next;
        }
    }
    return 0;
}

step4、使用gcc命令进行编译

gcc -o cJSONTest cJSONTest.c cJSON.c

step5、运行cJSONTest

./cJSONTest

使用cJSON的时候要特别注意:根据类型使用不同的变量进行取值。如果要使用字符串, 直接调用cJSON_PrintUnformatted(item);即可。

1.7、通过Android NDK交叉编译cJSON

step1、安装依赖

下载时git
编译时Android NDK

step2、使用git命令下载cJSON源码

git clone https://github.com/DaveGamble/cJSON.git

step3、进入cJSON目录

cd cJSON

step4、查看有哪些分支

step5、由于cJSON项目的主干(master)分支上提交的是开发代码,它可能不稳定。最好切换到最新的稳定版本分支上面, 最新的稳定版本分支是1.6

git checkout 1.6

step6、查看1.6分支的源码如下

step7、创建一个项目目录cJSON-for-Android/jni

mkdir -p cJSON-for-Android/jni

step8、将cJSON.hcJSON.c两个文件复制到cJSON-for-Android/jni目录中

cp cJSON/cJSON.* cJSON-for-Android/jni/

step9、在cJSON-for-Android/jni目录中创建Android.mk文件,其内容如下

LOCAL_PATH      := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := cJSON
LOCAL_SRC_FILES := cJSON.c

include $(BUILD_SHARED_LIBRARY)

现在工程创建好了,工程的目录结构如下:

step10、在cJSON-for-Android目录中执行ndk-build命令进行构建

构建成功后的目录结构如下:

libs目录下的就是这些CPU平台对应的动态库。

由于Android NDKr16b版本开始不支持armeabi这个目录了, 所以,你看到没有生成这个目录。