Json学习总结 C语言专用

json学习总结

因为自己没回不常用时就会忘特写这边文章进行自己的学习整理,也方便自己以后不用再次查阅
csdn有很多大神自己也是用过他们的博客才慢慢学会的,自己才疏学浅大家多见谅。

1.json概述

     JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

2.json几种规范格式

2.1 json数值
注意数值不需要加引号,键值对之间使用“,”
【单个数值】
{“value”:12}
【多个数值】
{“maxValue”:24, “minValue”:12};
2.2 JSON字符串
字符串需要加引号,键值对之间使用”,”。
【单个字符串】
{“name”:”xukai871105”}
【多个字符串】
{“name”:”never疯”, “blog”:”https://blog.csdn.net/qq_40574571“}
3.3 JSON布尔
请注意JSON格式中的值可以使用布尔类型,且不需要加引号,如果true或false被引号包裹,那么便解析为JSON字符串,请处理稍有不同。
{“success”:false}
3.4 JSON数组
{“lists”:[5,6,7,8]};
3.4 JSON嵌套
{
“path”:”D:/Scanner/2017-2018-1/13SC34130901-001”,
“studentlist”:[
{“snum”:”1142310206”,”filename”:”013_SC34130901_1142310206_59.jpg”,”pnum”:2,”name”:”哲儿”},
{“snum”:”1142310206”,”filename”:”013_SC34130901_1142310206_59.jpg”,”pnum”:2,”name”:”哲儿”}
]
}

就是以上格式一定要规范否则在json解析时是会报错的

3.json结构体

typedef struct cJSON {  
 struct cJSON *next,*prev;   
 struct cJSON *child;   
 int type;   
 char *valuestring;   
 int valueint;  
 double valuedouble;   
 char *string;   
} cJSON; 

4.json写

在读写前先把json需要的头文件准备好
“cJSON.h”
“cJSON.c”
这个自己去找吧,有很多,我就不提供了
显示一个简单的

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
int main (int argc, const char * argv[])
{
    // 创建JSON Object
    cJSON *root = cJSON_CreateObject();
    // 加入节点(键值对),节点名称为value,节点值为123.4
    cJSON_AddNumberToObject(root,"value",123.4);
    // 打印JSON数据包
    char *out = cJSON_Print(root);
    printf("%s\n",out);
    // 释放内存
    cJSON_Delete(root);
    free(out);
    return 0;
}

结果
{
        "value":        123.4
}

  1. cJSON_CreateObject函数可创建一个根数据项,之后便可向该根数据项中添加string或int等内容
  2. cJSON_AddNumberToObject向节点中添加子节点,例如此处添加value节点,节点值为123.4
  3. cJSON_Print函数可以打印根数据项,加入制表符换行符等标识符使得JSON数据包更易阅读
  4. 使用free函数释放被out占用的内存空间

一个我自己做时比较复杂的

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "cJSON.h"
#include "cJSON.c"
#include<iostream>
using namespace std;

int main()
{

    //创建一个空的文档(对象)
    cJSON *json = cJSON_CreateObject();

    //向文档中增加一个键值对{"name":"王大锤"}
    cJSON_AddItemToObject(json,"name",cJSON_CreateString("王大锤"));
    //向文档中添加一个键值对
    //cJSON_AddItemToObject(json,"age",cJSON_CreateNumber(29));
    cJSON_AddNumberToObject(json,"age",29);

    cJSON *array = NULL;
    cJSON_AddItemToObject(json,"love",array=cJSON_CreateArray());
    cJSON_AddItemToArray(array,cJSON_CreateString("LOL"));
    cJSON_AddItemToArray(array,cJSON_CreateString("NBA"));
    cJSON_AddItemToArray(array,cJSON_CreateString("Go shopping"));

    cJSON_AddNumberToObject(json,"score",59);
    cJSON_AddStringToObject(json,"address","beijing");

    //将json结构格式化到缓冲区
    char *buf = cJSON_Print(json);
    //打开文件写入json内容
    FILE *fp = fopen("D:\\项目实战\\扫描仪相关\\json\\json生成文件\\jsonsuccess.json","w");
    fwrite(buf,strlen(buf),1,fp);
    free(buf);
    fclose(fp);
    //释放json结构所占用的内存
    cJSON_Delete(json);
    return 0;
}


结果

{
    "name": "王大锤",
    "age":  29,
    "love": ["LOL", "NBA", "Go shopping"],
    "score":    59,
    "address":  "beijing"
}

4.json读

也是自己做的一个 看时理解着改 一般都没啥问题

文件:
{
     "path":"D:/Scanner/2017-2018-1/13SC34130901-001",
    "studentlist":[
        {"snum":"1142310206","filename":"013_SC34130901_1142310206_59.jpg","pnum":2,"name":"哲儿"},
        {"snum":"1142310206","filename":"013_SC34130901_1142310206_59.jpg","pnum":2,"name":"哲儿"}
    ]
}

代码段:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "cJSON.h"
#include "cJSON.c"
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    ifstream f;
    string read;
    char *count;
    cJSON *json;//封装后的json对象
    f.open("C:\\Users\\hasee\\Desktop\\tmp.json");
    while(getline(f,read,'#'))
    {
        count=&read[0];
        cJSON  *json_value, *json_timestamp,*url;
        json = cJSON_Parse(count);
        if(json == NULL)
        {
            printf("json pack into cjson error...");
        }
        else //打包成功调用cJSON_Print打印输出
        {
            cJSON_Print(json);
        }

        if (!json)
        {
            printf("Error before: [%s]\n",cJSON_GetErrorPtr());
        }
        else
        {
            cout<<"success"<<endl;
            // 解析开关值
            json_timestamp = cJSON_GetObjectItem( json, "path");
            if( json_timestamp->type == cJSON_String )
            {
                // valuestring中获得结果
                printf("path:%s\r\n",json_timestamp->valuestring);
            }

            //获取数组对象
            url=cJSON_GetObjectItem(json,"studentlist");
            //获取数组对象个数
            int array_size=cJSON_GetArraySize(url);
            //获取数组对象孩子节点
            cJSON* arr_item = url->child;
            cout<<array_size<<endl;
            for(int i=0;i <=(array_size-1);++i)
            {

                 //cJSON_Print函数可以打印根数据项,加入制表符换行符等标识符使得JSON数据包更易阅读
                cJSON_Print(cJSON_GetObjectItem(arr_item,"snum"));
                json_timestamp = cJSON_GetObjectItem( arr_item, "snum");
                printf("snum:%s\r\n",json_timestamp->valuestring);

                cJSON_Print(cJSON_GetObjectItem(arr_item,"filename"));
                json_timestamp = cJSON_GetObjectItem(arr_item, "filename");
                printf("filename:%s\r\n",json_timestamp->valuestring);

                cJSON_Print(cJSON_GetObjectItem(arr_item,"pnum"));
                json_timestamp = cJSON_GetObjectItem(arr_item,"pnum");
                printf("punm:%d\r\n",json_timestamp->valueint);

                cJSON_Print(cJSON_GetObjectItem(arr_item,"name"));
                json_timestamp = cJSON_GetObjectItem(arr_item, "name");
                printf("name:%s\r\n",json_timestamp->valuestring);
                arr_item = arr_item->next;//下一个子对象
            }
            // 释放内存空间
            cJSON_Delete(json);
            cJSON_Delete(url);
            cJSON_Delete(arr_item);
        }
    }
    return 0;
}

结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_40574571/article/details/80579338
今日推荐