IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 知识巩固源码落实之7:json协议使用cjson的构造和解析 -> 正文阅读

[大数据]知识巩固源码落实之7:json协议使用cjson的构造和解析

网络传输中,数据交互也需要一些自定义协议,其实json就是最好用之一。

使用cjson进行json字符串的构造,以及对其进行对应解析的测试代码。

1:背景介绍

JSNON作为一种轻量级的数据交互格式,易于阅读和编写,易于解析和生成。

日常开发中对json的使用次数也越来越多。

我常用的就是使用cjon以及jsoncpp对数据进行构造以及解析。

cjson因为直接包含一个头文件和.c文件就可以使用,特别方便,这里整理一些使用cjson进行构造与解析的实例,做代码备份。

2:测试代码

2.1:构造json格式的数据,返回json字符串

/*********************
{
	"name":	"test",
	"age":	80,
	"languages":	["C++", "Java"],
	"phone":	{
		"number":	"1867216i144",
		"type":	"home"
	},
	"languages":	[{
			"name":	"Linux kernel development",
			"price":	"7.7"
		}, {
			"name":	"Linux server development",
			"price":	"8.0"
		}],
	"vip":	true,
	"address":	""
}
*********************/

char * make_json_str()
 {
 	// 创建json对象
    cJSON *root = cJSON_CreateObject();
    // 添加键值对
    cJSON_AddItemToObject(root, "name", cJSON_CreateString("test"));
    cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(80));
    // 创建json数组
    cJSON *languages = cJSON_CreateArray();
    cJSON_AddItemToArray(languages, cJSON_CreateString("C++"));
    cJSON_AddItemToArray(languages, cJSON_CreateString("Java"));
    cJSON_AddItemToObject(root, "languages", languages);

    cJSON *phone = cJSON_CreateObject();
    cJSON_AddItemToObject(phone, "number", cJSON_CreateString("1867216i144"));
    cJSON_AddItemToObject(phone, "type", cJSON_CreateString("home"));
    cJSON_AddItemToObject(root, "phone", phone);

    cJSON *book0 = cJSON_CreateObject();
    cJSON_AddItemToObject(book0, "name", cJSON_CreateString("Linux kernel development"));
    cJSON_AddItemToObject(book0, "price", cJSON_CreateNumber(7.7));
    cJSON *book1 = cJSON_CreateObject();
    cJSON_AddItemToObject(book1, "name", cJSON_CreateString("Linux server development"));
    cJSON_AddItemToObject(book1, "price", cJSON_CreateNumber(8.0));
    // 创建json数组
    cJSON *books = cJSON_CreateArray();
    cJSON_AddItemToArray(books, book0);
    cJSON_AddItemToArray(books, book1);
    cJSON_AddItemToObject(root, "books", books);

    cJSON_AddItemToObject(root, "vip", cJSON_CreateBool(1));
    cJSON_AddItemToObject(root, "address", cJSON_CreateString("")); // NULL值的问题

    //格式化json对象 并返回
    char *jsonstr = cJSON_Print(root);
    //注意释放 内部会释放其子节点的
    cJSON_Delete(root);

    printf("make json str is [%lu][%s] \n", strlen(jsonstr), jsonstr);
    return jsonstr;
 }

2.2:json字符串对应的解析

void printCJson(cJSON *root);
int parse_json_str(const char * jsonstr)
{
	if(jsonstr == NULL)
	{
		printf("parse json error: jsonstr is null \n");
		return -1;
	}
	cJSON *root = cJSON_Parse(jsonstr);
	if(root == NULL)
	{
		printf("parse json error: cJSON_Parse error \n");
		return -1;
	}
	//获取对应的字段并进行打印
	printCJson(root);
	cJSON_Delete(root);
    return 0;
}

void printCJson(cJSON *root)
{
	//获取到各个子对象
	cJSON *name = cJSON_GetObjectItem(root, "name");
    cJSON *age = cJSON_GetObjectItem(root, "age");
    cJSON *languages = cJSON_GetObjectItem(root, "languages");
    cJSON *phone = cJSON_GetObjectItem(root, "phone");
    cJSON *books = cJSON_GetObjectItem(root, "books");
    cJSON *vip = cJSON_GetObjectItem(root, "vip");
    cJSON *address = cJSON_GetObjectItem(root, "address");

    printf(" name: %s\n", name->valuestring);
    printf(" age: %d\n", age->valueint);
    printf(" languages: ");
    for (int i = 0; i < cJSON_GetArraySize(languages); i++)
    {
        cJSON *lang = cJSON_GetArrayItem(languages, i);
        if (i != 0)
        {
            printf(", ");
        }
        printf("%s", lang->valuestring);
    }
    printf("\n");

    cJSON *number = cJSON_GetObjectItem(phone, "number");
    cJSON *type = cJSON_GetObjectItem(phone, "type");
    printf(" phone number: %s, type: %s\n", number->valuestring, type->valuestring);

    for (int i = 0; i < cJSON_GetArraySize(books); i++)
    {
        cJSON *book = cJSON_GetArrayItem(books, i);
        cJSON *name = cJSON_GetObjectItem(book, "name");
        cJSON *price = cJSON_GetObjectItem(book, "price");
        printf(" book name: %s, price: %lf\n", name->valuestring, price->valuedouble);
    }

    printf(" vip: %d\n", vip->valueint);
    if (address && !cJSON_IsNull(address))
    {
        printf(" address: %s\n", address->valuestring);
    }
    else
    {
        printf(" address is null\n");
    }
}

2.3:测试调用主函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"   //需要包含cjson的头文件 以及编译时要编译对应的cjson.c一起

int main()
{
	//构造json字符串  内部会对json字符串申请内存 要释放
	char * strjson = make_json_str();
	//解析构造的json字符串 打印对应的字段
	parse_json_str(strjson);
	free(strjson);
	return 0;
}

3:执行结果

make json str is [286][{
	"name":	"test",
	"age":	80,
	"languages":	["C++", "Java"],
	"phone":	{
		"number":	"1867216i144",
		"type":	"home"
	},
	"books":	[{
			"name":	"Linux kernel development",
			"price":	7.7
		}, {
			"name":	"Linux server development",
			"price":	8
		}],
	"vip":	true,
	"address":	""
}] 
 name: test
 age: 80
 languages: C++, Java
 phone number: 1867216i144, type: home
 book name: Linux kernel development, price: 7.700000
 book name: Linux server development, price: 8.000000
 vip: 1
 address: 

我开始试着积累一些常用代码:自己代码库中备用

我的知识储备更多来自这里,推荐你了解:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:11:15  更:2022-02-16 13:13:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:07:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码