JSON解读和cJSON API的使用

1. JSON是什么?

        官方描述:

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言:JSON使用avascript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

        以上从JSON的概念,用途,支持平台三个方面解释了JSON是什么的问题。现在说下我个人的理解。

  • JSON是一种数据的表示方法,JSON不是具体的数值,仅仅是一种数值的展现格式。
  • JSON在各种语言中都有实现方式,也就是可以形成这种展现格式。

2. JSON对象是什么? JSON数据是什么? JSON数据字符串是什么?

  • JSON对象是JSON数据的代表,就好比名字代表了一个人。例如: 变量和值是两个不同的东西,使用时通过变量来代表值。
  • JSON数据是通过JSON格式组织起来的数据,是JSON对象代表的值。
  • JSON数据字符串是由JSON数据通过转义形成的字符串。

3. cJSON基本函数的使用。JSON数据格式检查工具:https://www.sojson.com/

    //以下列JSON数据的合成和分解为例。
    {
        "name": "李四",
        "age": 25,
        "height": 173.56,
        "course": ["Chinese", "English", "math", "physics"],
        "scores": {
        "Chinese": 89,
        "English": 130,
        "math": 100,
        "physics": 90
        }
    }

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

int main()
{
    char json_str[1024] = {0};
    printf_s("---->---->---->---->JSON数据合成---->---->---->---->\n");
    //添加键值对函数cJSON_AddItemToArray()参数1是目的对象,参数2是键名,参数3是键值。
    //创建JSON对象,分配内存块存储JSON数据。
    cJSON* root = cJSON_CreateObject();
    //添加键值对到JSON对象,键值是字符串。
    cJSON_AddStringToObject(root, "name", "李四");
    //添加键值对到JSON对象,键值是数字。
    cJSON_AddNumberToObject(root, "age", 25);
    //添加键值对到JSON对象,键值是数字。
    cJSON_AddNumberToObject(root, "height", 173.56);

    //添加键值对到JSON对象,键值是数组。
    cJSON *course = cJSON_CreateArray();
    //添加成员到数组,因为参数2是cJON*类型,所以需要cJSON_CreateString创建。
    cJSON_AddItemToArray(course, cJSON_CreateString("Chinese"));
    cJSON_AddItemToArray(course, cJSON_CreateString("English"));
    cJSON_AddItemToArray(course, cJSON_CreateString("math"));
    cJSON_AddItemToArray(course, cJSON_CreateString("physics"));
    //添加数组course到root对象。
    cJSON_AddItemToObject(root, "course", course);
    
    cJSON* scores = cJSON_CreateObject();
    cJSON_AddItemToObject(scores, "Chinese", cJSON_CreateNumber(89));
    cJSON_AddItemToObject(scores, "English", cJSON_CreateNumber(130));
    cJSON_AddItemToObject(scores, "math", cJSON_CreateNumber(100));
    cJSON_AddItemToObject(scores, "physics", cJSON_CreateNumber(90));
    //添加scores到root对象。
    cJSON_AddItemToObject(root, "scores", scores);
    
    //JSON数据组织完成,非格式化打印出来进行测试, 会申请额外内存。
    const char *cjson_unformat_str = cJSON_PrintUnformatted(root);

    //格式化打印出来进行测试,会申请额外内存。
    const char* cjson_format_str = cJSON_Print(root);

    //cJSON_PrintBuffered(root, 1024, 1);
    //销毁JSON对象,释放JSON数据占用的内存块。
    cJSON_Delete(root);
    root = NULL;

    //cJSON_PrintUnformatted cJSON_Print 会申请内存,所以使用完后要释放。
    printf_s("----> cjson_unformat_str: %s\n\n", cjson_unformat_str);
    printf_s("----> cjson_format_str: %s\n", cjson_format_str);

    //保留一份副本。
    strcpy(json_str, cjson_unformat_str);
    free(cjson_unformat_str);
    cjson_unformat_str = NULL;

    free(cjson_format_str);
    cjson_format_str = NULL;

    printf_s("---->---->---->---->JSON数据分解---->---->---->---->\n");
    //解析JSON字符串为JSON对象。
    root = cJSON_Parse(json_str);
    if (NULL == root) {
        printf_s("----> cJSON_Parse failed\n");
        return -1;
    }

    //获取name键值的cJSON对象。
    cJSON* name = cJSON_GetObjectItem(root, "name");
    cJSON* age = cJSON_GetObjectItem(root, "age");
    cJSON* height = cJSON_GetObjectItem(root, "height");
    printf("----> name: %s\n", name->valuestring);
    printf("----> age: %d\n", age->valueint);
    printf("----> height: %lf\n", height->valuedouble);

    //获取course键值的cJSON对象。
    course = cJSON_GetObjectItem(root, "course");
    //获取数组大小
    int array_size = cJSON_GetArraySize(course);
    //循环获取数组元素的cJSON对象
    cJSON* item = NULL;
    for (int i = 0; i < array_size; i++) {
        item = cJSON_GetArrayItem(course, i);
        printf("----> Array[%d]: %s\n", i, item->valuestring);
    }
    
    //获取scores键值的cJSON对象。
    scores = cJSON_GetObjectItem(root, "scores");
    cJSON* Chinese = cJSON_GetObjectItem(scores, "Chinese");
    cJSON* English = cJSON_GetObjectItem(scores, "English");
    cJSON* math = cJSON_GetObjectItem(scores, "math");
    cJSON* physics = cJSON_GetObjectItem(scores, "physics");
    printf_s("----> Chinese: %d\n", Chinese->valueint);
    printf_s("----> English: %d\n", English->valueint);
    printf_s("----> math: %d\n", math->valueint);
    printf_s("----> physics: %d\n", physics->valueint);
    cJSON_Delete(root);
    root = NULL;

    while (1)
        ;
}

猜你喜欢

转载自blog.csdn.net/qq_34473570/article/details/108655409