知识巩固源码落实之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等技术内容,立即学习

目录
相关文章
|
18天前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
3月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
19天前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
4月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
154 67
|
7月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
658 29
|
7月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
436 4
JSON数据解析实战:从嵌套结构到结构化表格
|
7月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
191 4
|
7月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
7月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。

推荐镜像

更多
  • DNS