jsoncpp封装和解析字符串、数字、布尔值和数组

2023-11-20

使用jsoncpp进行字符串、数字、布尔值和数组的封装与解析。

1)下载jsoncpp的代码库 百度网盘地址 :http://pan.baidu.com/s/1ntqQhIT

2)解压缩文件 jsoncpp.rar

unzip jsoncpp.rar

3)修改jsoncpp/src/main.cpp文件

vim src/main.cpp
  1 #include <string>
  2 #include <json/json.h>
  3 #include "stdio.h"
  4 
  5 int ReadJson(const std::string &);
  6 std::string writeJson();
  7 
  8 int main(int argc, char** argv)
  9 {
 10     using namespace std;
 11 
 12     std::string strMsg;
 13 
 14     cout<<"--------------------------------"<<endl;
 15     strMsg = writeJson();
 16     cout<< "json write : " << endl << strMsg << endl;
 17     cout<<"--------------------------------"<<endl;
 18     cout<< "json read :" << endl;
 19     ReadJson(strMsg);
 20     cout<<"--------------------------------"<<endl;
 21 
 22     return 0;
 23 }
 24 
 25 int ReadJson(const std::string & strValue) 
 26 {
 27     using namespace std;
 28 
 29     Json::Reader reader;
 30     Json::Value value;
 31 
 32     if (reader.parse(strValue, value))
 33     {
 34         //解析json中的对象
 35         string out = value["name"].asString();
 36         cout << "name : "   << out << endl;
 37         cout << "number : " << value["number"].asInt() << endl;
 38         cout << "value : "  << value["value"].asBool() << endl;
 39         cout << "no such num : " << value["haha"].asInt() << endl;
 40         cout << "no such str : " << value["hehe"].asString() << endl;
 41 
 42         //解析数组对象
 43         const Json::Value arrayNum = value["arrnum"];
 44         for (unsigned int i = 0; i < arrayNum.size(); i++)
 45         {
 46             cout << "arrnum[" << i << "] = " << arrayNum[i];
 47         }
 48         //解析对象数组对象
 49         Json::Value arrayObj = value["array"];
 50         cout << "array size = " << arrayObj.size() << endl;
 51         for(unsigned int i = 0; i < arrayObj.size(); i++)
 52         {
 53             cout << arrayObj[i];
 54         }
 55         //从对象数组中找到想要的对象
 56         for(unsigned int i = 0; i < arrayObj.size(); i++)
 57         {
 58             if (arrayObj[i].isMember("string")) 
 59             {
 60                 out = arrayObj[i]["string"].asString();
 61                 std::cout << "string : " << out << std::endl;
 62             }
 63         }
 64     }
 65 
 66     return 0;
 67 }
 68 
 69 std::string writeJson() 
 70 {
 71     using namespace std;
 72 
 73     Json::Value root;
 74     Json::Value arrayObj;
 75     Json::Value item;
 76     Json::Value iNum;
 77 
 78     item["string"]    = "this is a string";
 79     item["number"]    = 999;
 80     item["aaaaaa"]    = "bbbbbb";
 81     arrayObj.append(item);
 82 
 83     //直接对jsoncpp对象以数字索引作为下标进行赋值,则自动作为数组
 84     iNum[1] = 1;
 85     iNum[2] = 2;
 86     iNum[3] = 3;
 87     iNum[4] = 4;
 88     iNum[5] = 5;
 89     iNum[6] = 6;
 90 
 91     //增加对象数组
 92     root["array"]    = arrayObj;
 93     //增加字符串
 94     root["name"]    = "json";
 95     //增加数字
 96     root["number"]    = 666;
 97     //增加布尔变量
 98     root["value"]    = true;
 99     //增加数字数组
100     root["arrnum"]    = iNum;
101 
102     root.toStyledString();
103     string out = root.toStyledString();
104 
105     return out;
106 }

4)在目录jsoncpp/ 下执行make命令

jsoncpp$ make
mkdir -p objs/src/json;  mkdir -p objs/src;
g++ -c -Wall -Werror -g -I include src/json/json_reader.cpp -o objs/src/json/json_reader.o
g++ -c -Wall -Werror -g -I include src/json/json_value.cpp -o objs/src/json/json_value.o
g++ -c -Wall -Werror -g -I include src/json/json_writer.cpp -o objs/src/json/json_writer.o
g++ -c -Wall -Werror -g -I include src/main.cpp -o objs/src/main.o
g++  objs/src/json/json_reader.o objs/src/json/json_value.o objs/src/json/json_writer.o objs/src/main.o -o main

5)运行jsoncpp/下的main文件

./main

6)运行结果如下

fengbo: jsoncpp$ ./main 
--------------------------------
json write : 
{
   "array" : [
      {
         "aaaaaa" : "bbbbbb",
         "number" : 999,
         "string" : "this is a string"
      }
   ],
   "arrnum" : [ null, 1, 2, 3, 4, 5, 6 ],
   "name" : "json",
   "number" : 666,
   "value" : true
}

--------------------------------
json read :
name : json
number : 666
value : 1
no such num : 0
no such str : 
arrnum[0] = null
arrnum[1] = 1
arrnum[2] = 2
arrnum[3] = 3
arrnum[4] = 4
arrnum[5] = 5
arrnum[6] = 6
array size = 1

{
    "aaaaaa" : "bbbbbb",
    "number" : 999,
    "string" : "this is a string"
}
string : this is a string
--------------------------------

 

作者:风波

mail : fengbohello@qq.com

 


作  者:郝峰波 
个人网站:http://www.fengbohello.top/ 
E-mail : fengbohello@foxmail.com 
欢迎转载,转载请注明作者和出处。 
因作者水平有限,不免出现遗漏和错误。希望热心的同学能够帮我指出来,我会尽快修改。愿大家共同进步,阿里嘎多~

标签:  JSON
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jsoncpp封装和解析字符串、数字、布尔值和数组 的相关文章

随机推荐

  • 2048游戏矩阵操作算法

    题目 1 手指向一个方向滑动 所有格子会向那个方向运动 2 相同数字的两个格子 相撞时数字会相加 输入描述 1 输入为一个3 3的矩阵 2 接下来输入一个1 4的数字 1表示向上滑动 2表示向下划动 3表示向左滑动 4表示向右滑动 输出描述
  • Ireport 报表设计部分填坑记录 基于Ireport 4.5.1

    Ireport 报表设计 基于Ireport 4 5 1 Ireport 换行遇到分页时 一行会被拆分为两行 断行 方式一 面板直接修改 点击detail栏的空白处 修改其 Split Type属性值为 Prevent 如果方式一 无法修改
  • 内存取证CTF-Memlabs靶场6

    1 挑战说明 我们从情报局收到了这个内存转储 他们说这个证据可能包含黑帮大卫本杰明的一些秘密 这个内存转储是从本周早些时候被 FBI 逮捕的他的一名员工那里获取的 你的工作是通过内存转储 看看你是否能找出一些东西 FBI还表示 大卫通过互联
  • 【AndroidStudio】按钮基本操作(普通按钮、图片按钮、单选按钮设置)(单击事件监听器触发对话框和页面跳转)

    普通按钮 普通按钮xml设置
  • [NCTF2019]Fake XML cookbook

    NCTF2019 Fake XML cookbook 日常刷题 打开题目嗯 一开始我的脑子里想到的是禁止自娱自乐 狗头 哈哈 第一想法就是试一下admin 别问为什么 web狗的自觉 果然没这么容易 抓包 将提交的数据放到了doLogin
  • vue router在同界面使用 this.$router跳转路由,mounted不再调用

    1 在vue中 刷新数据常用的办法是 this r o u t e r g o 0 或 者 t h i s router go 0 或者this router go 0 或者this router push path 在最近一次的使用时 发
  • 第三章 总线

    一 系统总线概念 系统总线是计算机内部各个组件之间传输数据和控制信息的通信线路 连接中央处理器 内存 输入输出设备 扩展插槽等各个组件 是计算机系统中最重要的硬件组成部分之一 具有数据传输 控制信号传输和总线协议等功能 系统总线的性能对计算
  • 登录即代表您同意 用户服务协议

    UILabel remindLabel if remindLabel remindLabel UILabel alloc init NSDictionary attributes NSFontAttributeName UIFont sys
  • 一文搞懂Mybatis原理

    文章目录 一 快速入门 二 查询流程分析 2 1首先通过ClassLoader读取配置文件生成输入流 2 2建造者模式加载配置创建SQLSessionFactory 2 2 1SQLSessionFactoryBuilder builder
  • 排序算法(2) 快速排序——快排原理以及快排函数qsort

    上次我们分享了一个基本排序方法 冒泡排序的使用 今天我们来分享第二种排序方法 快速排序 快速排序 我们简称快排 我们先来回顾一下上次的冒泡排序 冒泡排序就是在一个序列里 两两比较并根据大小关系进行换位处理 经过多次从头到尾的比较 从而实现整
  • 百面A/B测试

    1 在对模型进行过充分的离线评估之后 为什么还要进行在线A B测试 1 离线评估无法完全消除模型过拟合的影响 因此 得出的离线评估结果无法完全替代线上评估结果 2 离线评估无法完全还原线上的工程环境 一般来讲 离线评估往往不考虑线上环境的延
  • 华为OD机试真题- 日志首次上报最多积分【2023Q1】

    题目描述 日志采集是运维系统的的核心组件 日志是按行生成 每行记做一条 由采集系统分批上报 如果上报太频繁 会对服务端造成压力 如果上报太晚 会降低用户的体验 如果一次上报的条数太多 会导致超时失败 为此 项目组设计了如下的上报策略 1 每
  • 三种出包命令npm, yarn, webpack的对比

    在出包的时候 总是会在不同项目里看到不同的出包命令 但留心观察了一下 最常被使用的就是下面这三个 npm run XXX yarn run XXX webpack entry file destination for bundled fil
  • C++---之waitKey()函数

    waitKey 函数详解 1 waitKey 这个函数是在一个给定的时间内 单位ms 等待用户按键触发 如果用户没有按下 键 则接续等待 循环 2 如下所示 while 1 if waitKey 100 27 break 在这个程序中 我们
  • eclipse maven 导出项目依赖的jar包

    本文转自至 http blog csdn net andyliulin article details 46544555 一 导出到默认目录 targed dependency 从Maven项目中导出项目依赖的jar包 进入工程pom xm
  • Qt在windows和linux下使用默认浏览器打开设置的链接

    QString webstr http www baidu com 设置要打开的网页 bool openService QDesktopServices openUrl QUrl webstr 使用默认浏览器打开 if openServic
  • Testflight 添加外部测试人员

    内部测试人员 不需要提供所有的metadata 外部测试人员 为了使得外部人员可以测试app的预发布build 必须提供如下的metadata What to test App description Feedback email Mark
  • 利用Python读取MongoDB的数据

    近日在处理数据的时候遇到一个问题 数据存储在MongoDB数据库 如图1 而MongoDB模式自由 具有很大的灵活性 可以把不同结构的文档存储在同一个数据库里 即表的字段不是完全固定的 当某个字段有值时就会显示该字段 而当该字段没有值时就不
  • 3.git 将本地仓库推到远程

    1 创建一个本地仓库 git init 2 把文件添加到版本仓库中 git add 3 生成提交记录 git commit m git init 4 关联到远程库 git remote add origin 你的远程库 5 获取远程库与本地
  • jsoncpp封装和解析字符串、数字、布尔值和数组

    使用jsoncpp进行字符串 数字 布尔值和数组的封装与解析 1 下载jsoncpp的代码库 百度网盘地址 http pan baidu com s 1ntqQhIT 2 解压缩文件 jsoncpp rar unzip jsoncpp ra