【C++】json数据处理

news2024/10/2 1:25:18

Json是一种轻量级的数据交换格式。

文章目录

    • 1. cJson介绍
    • 2. 解析json数据
    • 3. 封装json数据
    • 4. 从文件中读取json

1. cJson介绍

JSON对象是一个无序的"名称/值"键值对的集合:

"{“开始,以”}"结束,允许嵌套使用;
每个名称和值成对出现,名称和值之间使用":"分隔;
键值对之间用","分隔
这些字符前后允许存在无意义的空白符;

对于键值,可以有如下值:

一个新的json对象
数组:使用"[“和”]"表示
数字:直接表示,可以是整数,也可以是浮点数
字符串:使用引号"表示
字面值:false、null、true中的一个(必须是小写)

cJSON是一个用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点。

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

在工程中,只需要包含这两个文件即可:

在这里插入图片描述

2. 解析json数据

一个实例:

#include <iostream>
extern "C" {
	#include <stdio.h>
	#include "cJSON.h"
}

// 定义一个Json数据
char *message =
"{                              \
    \"name\":\"XiaoMing\",   \
    \"age\": 22,                \
    \"weight\": 60,           \
    \"address\":                \
        {                       \
            \"country\": \"China\",\
            \"zip-code\": 111111\
        },                      \
    \"skill\": [\"c\", \"Java\", \"Python\"],\
    \"student\": false          \
}";

int main(void)
{
	// 实例化
	cJSON* cjson_test = NULL;
	cJSON* cjson_name = NULL;
	cJSON* cjson_age = NULL;
	cJSON* cjson_weight = NULL;
	cJSON* cjson_address = NULL;
	cJSON* cjson_address_country = NULL;
	cJSON* cjson_address_zipcode = NULL;
	cJSON* cjson_skill = NULL;
	cJSON* cjson_student = NULL;
	int    skill_array_size = 0, i = 0;
	cJSON* cjson_skill_item = NULL;

	// 解析整段Json数据
	cjson_test = cJSON_Parse(message);
	if (cjson_test == NULL)
	{
		printf("parse fail.\n");
		return -1;
	}

	// 依次根据名称提取JSON数据(键值对)
	cjson_name = cJSON_GetObjectItem(cjson_test, "name");
	cjson_age = cJSON_GetObjectItem(cjson_test, "age");
	cjson_weight = cJSON_GetObjectItem(cjson_test, "weight");

	printf("name: %s\n", cjson_name->valuestring);
	printf("age:%d\n", cjson_age->valueint);
	printf("weight:%.1f\n", cjson_weight->valuedouble);

	// 解析嵌套json数据 
	cjson_address = cJSON_GetObjectItem(cjson_test, "address");
	cjson_address_country = cJSON_GetObjectItem(cjson_address, "country");
	cjson_address_zipcode = cJSON_GetObjectItem(cjson_address, "zip-code");
	printf("address-country:%s\naddress-zipcode:%d\n", cjson_address_country->valuestring, cjson_address_zipcode->valueint);

	// 解析数组 
	cjson_skill = cJSON_GetObjectItem(cjson_test, "skill");
	skill_array_size = cJSON_GetArraySize(cjson_skill);
	printf("skill:[");
	for (i = 0; i < skill_array_size; i++)
	{
		cjson_skill_item = cJSON_GetArrayItem(cjson_skill, i);
		printf("%s,", cjson_skill_item->valuestring);
	}
	printf("\b]\n");

	// 解析布尔型数据
	cjson_student = cJSON_GetObjectItem(cjson_test, "student");
	if (cjson_student->valueint == 0)
	{
		printf("student: false\n");
	}
	else
	{
		printf("student:error\n");
	}

	return 0;
}

结果如下:

在这里插入图片描述

3. 封装json数据

一个实例:

#include <iostream>
extern "C" {
#include <stdio.h>
#include "cJSON.h"
}

int main(void)
{
	cJSON* cjson_test = NULL;
	cJSON* cjson_address = NULL;
	cJSON* cjson_skill = NULL;
	char* str = NULL;

	/* 创建一个JSON数据对象(链表头结点) */
	cjson_test = cJSON_CreateObject();

	/* 添加一条字符串类型的JSON数据(添加一个链表节点) */
	cJSON_AddStringToObject(cjson_test, "name", "XiaoMing");

	/* 添加一条整数类型的JSON数据(添加一个链表节点) */
	cJSON_AddNumberToObject(cjson_test, "age", 22);

	/* 添加一条浮点类型的JSON数据(添加一个链表节点) */
	//cJSON_AddNumberToObject(cjson_test, "weight", 60);	//提示找不到标识符

	/* 添加一个嵌套的JSON数据(添加一个链表节点) */
	cjson_address = cJSON_CreateObject();
	cJSON_AddStringToObject(cjson_address, "country", "China");
	//cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
	cJSON_AddItemToObject(cjson_test, "address", cjson_address);

	/* 添加一个数组类型的JSON数据(添加一个链表节点) */
	cjson_skill = cJSON_CreateArray();
	cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("C"));
	cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Java"));
	cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Python"));
	cJSON_AddItemToObject(cjson_test, "skill", cjson_skill);

	/* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
	cJSON_AddFalseToObject(cjson_test, "student");

	/* 打印JSON对象(整条链表)的所有数据 */
	str = cJSON_Print(cjson_test);
	printf("%s\n", str);

	return 0;
}

结果如下:

在这里插入图片描述

4. 从文件中读取json

一个实例:

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include<sys/stat.h>  //stat
#include "cJSON.h" 
#define   FILENAME  "./map.json"

typedef struct 
{  
    int x;
    int y;
}arr;  
 

//解析一个结构数组 
int cJSON_to_struct_array(char *text, arr worker[])  
{  
    cJSON *json,*arrayItem,*item,*object;  
    int i = 0;  
 
    json=cJSON_Parse(text);     //parse
    if (!json)  
    {  
        printf("Error before: [%s]\n",cJSON_GetErrorPtr());  
    }  
    else 
    {  
        arrayItem=cJSON_GetObjectItem(json,"arr");  // 获取json对象中的arr节点
        if(arrayItem!=NULL)  
        {  
            int size=cJSON_GetArraySize(arrayItem);  //获取数组大小
            printf("cJSON_GetArraySize: size=%d\n",size);  
 
            for(i=0;i<size;i++)  
            {  
                printf("i=%d\n",i);  
                object=cJSON_GetArrayItem(arrayItem,i);  
 
                item=cJSON_GetObjectItem(object,"x"); // 获取json对象中的firstName节点
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, valueint is %d\n",item->type,item->valueint);  
                    memcpy(worker[i].x,item->valueint,strlen(item->valueint));  
                }  
                else 
                {  
                    printf("cJSON_GetObjectItem: get age failed\n");  
                }  
 
                item=cJSON_GetObjectItem(object,"y");  
                if(item!=NULL)  
                {  
                    printf("cJSON_GetObjectItem: type=%d, valueint=%d\n",item->type,item->valueint);  
                    worker[i].y=item->valueint;  
                }  
                else 
                {  
                    printf("cJSON_GetObjectItem: get age failed\n");  
                }  
            }  
        }  
  
    printf("\n\n");
        for(i=0;  i<sizeof(worker) / sizeof(worker[0]) ;i++)    //获取数组长度
        {  
            printf("i=%d",i);
            printf("x=%d,y=%d\n",  
                    worker[i].x,  
                    worker[i].y);
        }  
 
        cJSON_Delete(json);  
    }  
    return 0;  
}  
 
 // 文件大小
size_t get_file_size(const char *filepath)
{
   
    if(NULL == filepath)
        return 0;
    struct stat filestat;
    memset(&filestat,0,sizeof(struct stat));
    /*获取文件信息*/
    if(0 == stat(filepath,&filestat))
        return filestat.st_size;
    else
        return 0;
}

// 读取文件
void read_file(char *filename)  
{  
     FILE *fp;  

     arr worker[4]={{0}};  

  /*get file size*/
    size_t size = get_file_size(filename);
    if(0 == size)
    {
        printf("get_file_size failed!!!\n");
    }
        
    /*malloc memory*/
    char *buf = malloc(size+1);
    if(NULL == buf)
    {
        printf("malloc failed!!!\n");
        
    }
    memset(buf,0,size+1);

    fp=fopen(filename,"rb");  

    fread(buf,1,size,fp);  
    fclose(fp);  
 
    printf("read file %s complete, size=%d.\n",filename,size);  

    cJSON_to_struct_array(buf, worker);  
 
    free(buf);  
}  

// main
int main(int argc, char **argv)  
{  
 
    read_file(FILENAME);  

    // // 实例化
	// cJSON* cjson_x = NULL;
	// cJSON* cjson_y = NULL;

    // // 依次根据名称提取JSON数据(键值对)
	// cjson_x = cJSON_GetObjectItem(cjson_x, "x");
	// cjson_y = cJSON_GetObjectItem(cjson_y, "y");

    // printf("x:%d\n", cjson_x->valueint);
    // printf("y:%d\n", cjson_y->valueint);
 
    return 0;  
}  

在ubuntu编写makefile如下:

main:main.c
	gcc cJSON.c main.c -o main  -lm
clean:
	rm main

这样就能从json文件中读取数据了。

参考:http://t.csdn.cn/M7ClB

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相约3.8!罗姆EEPROM在线研讨会

科技的迭代更新速度不断超乎想象&#xff0c;人们也越来越追求数据的可追溯性和安全性&#xff0c;为避免意外情况导致数据丢失&#xff0c;在车载、工业等领域中&#xff0c;数据存储更经常使用安全性较好的EEPROM【带电可擦除可编程只读存储器】。与FLASH存储器的按“片”擦写…

偏向锁、轻量级所、自旋锁、重量级锁,它们都是什么?它们之间有什么关系?为什么会有这些锁?

互斥锁的本质是共享资源。 当有多个线程同时对一个资源进行操作时&#xff0c;为了线程安全&#xff0c;要对资源加锁。 更多基础内容参看上文《深入了解Java线程锁(一)》 接下来&#xff0c;我们来看看两个线程抢占重量级锁的情形&#xff1a; 上图讲述了两个线程ThreadA和…

JDBC-

文章目录JDBC1&#xff0c;JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2&#xff0c;JDBC快速入门2.1 编写代码步骤2.2 具体操作3&#xff0c;JDBC API详解3.1 DriverManager3.2 Connection &#xff08;事务归我管&#xff09;3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

CSS 浮动【快速掌握知识点】

目录 前言 一、设置浮动属性 二、确定浮动元素的宽度 三、清除浮动 总结&#xff1a; 前言 CSS浮动是一种布局技术&#xff0c;它允许元素浮动到其父元素的左侧或右侧&#xff0c;从而腾出空间给其他元素。 一、设置浮动属性 使用CSS float属性将元素设置为浮动。例如&…

【华为OD机试模拟题】用 C++ 实现 - 数组的中心位置(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

MySQL —— 表的约束

文章目录1. null 空属性2. default 默认值3. comment 列描述4. zerofill 格式化输出5. primary key 主键6. auto_increment 自增长7. 唯一键8. unique key 外键前言&#xff1a; 表的约束主要是靠数据类型。有些情况&#xff0c;光靠数据类型约束是不够的&#xff0c;比如想要限…

【Java】ThreadLocal原理

​ ThreadLocal ThreadLocal意为线程本地变量&#xff0c;用于解决多线程并发时访问共享变量的问题。 每个线程都会有属于自己的本地内存&#xff0c;在堆&#xff08;也就是上图的主内存&#xff09;中的变量在被线程使用的时候会被复制一个副本线程的本地内存中&#xff0c…

【H5 | CSS | JS】如何实现网页打字机效果?快收下这份超详细指南(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

在C#中初测OpencvSharp4

一、配置OpenCV 首先&#xff0c;我们新建一个工程&#xff0c;然后就是给这个工程配置OpenCV了&#xff0c;最简单的方法还是Nuget&#xff0c;来我们右键一个Nuget&#xff1a; 打开Nuget后&#xff0c;你可以直接输入OpenCVSharp4来查找&#xff0c;当然&#xff0c;如果你…

公司新来的00后真是卷王,工作没两年,跳槽到我们公司起薪20K都快接近我了

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

罗永浩进场之后,苹果入局之前:XR又寒冬了吗?

科技圈的悲欢并不相通。ChatGPT狂飙之际&#xff0c;XR领域正在迎来至暗时刻。岁末年初&#xff0c;就在罗永浩重返高科技创业,计划进军XR&#xff08;扩展现实&#xff09;类领域的时间段前后&#xff0c;接连出现了押注元宇宙的Meta裁员&#xff0c;Meta旗下VR工作室Ready At…

【华为OD机试模拟题】用 C++ 实现 - 快递业务站(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 流水线(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

数据库|(六)连接查询

&#xff08;六&#xff09;连接查询1. 笛卡尔乘积2. 连接查询分类2.1 按年代分2.2 按功能分3. 等值连接(sql 92标准)3.1 特点3.2 一般使用3.3 为表取别名3.4 两表顺序可以调换3.5 可以加筛选3.6 可以加分组3.7 可以加排序3.8 可以实现三表连接4. 非等值连接(sql 92标准)5. sql…

【深度学习】GPT系列模型:语言理解能力的革新

GPT-1&#x1f3e1; 自然语言理解包括一系列不同的任务&#xff0c;例如文本蕴涵、问答、语义相似度评估和文档分类。尽管大量的未标记文本语料库很充足&#xff0c;但用于学习这些特定任务的标记数据却很稀缺&#xff0c;使得判别式训练模型难以达到良好的表现。我们证明&…

Spring(入门)

1. 什么是spring&#xff0c;它能够做什么?2. 什么是控制反转(或依赖注入)3. AOP的关键概念4. 示例 4.1 创建工程4.2 pom文件4.3 spring配置文件4.4 示例代码 4.4.1 示例14.4.2 示例2 &#xff08;abstract&#xff0c;parent示例&#xff09;4.4.3 使用有参数构造方法创建jav…

【华为OD机试模拟题】用 C++ 实现 - 找数字(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

显示器管理工具:BetterDisplay Pro Mac

BetterDisplay Pro Mac 是一个非常棒的工具&#xff01;它可以让您将显示器转换为完全可缩放的屏幕&#xff0c;允许亮度控制&#xff0c;提供 XDR/HDR 升级&#xff08;在兼容显示器上超过 100% 的额外亮度&#xff09;&#xff0c;完全调光为黑色&#xff0c;帮助您为 Mac 创…

PRML笔记3-绪论中最小化错误分类率的理解

这个小节的内容很少&#xff0c;因为自己数学水平实在太差&#xff0c;所以理解不到之处还请批评指正。 在分类任务中我们希望尽可能减少错误的分类&#xff0c;例如我们有一些病人的临床数据&#xff0c;希望通过这些临床数据对患者的诊断提供帮助&#xff0c;比如根据临床数据…

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense&#xff1a; D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪、rea…