目录

  • CJsonObject
    • 1. CJsonObject 介绍
    • 2. CJsonObject 的官方例程 demo.cpp
    • 3. CJsonObject 使用中遇到的问题
      • 3.1 如何遍历json的key,并取其value?
      • 3.2 Replace一个key时,是否需要原value类型与替换后value类型一致?
      • 3.3 []和()的重载有什么区别,为什么要重载这两个操作符?
      • 3.4 如何用CJsonObject创建类似以下二维数组?
      • 3.5 请问一下使用CJsonObject如何创建如下形式的数组?

CJsonObject

1. CJsonObject 介绍

https://github.com/Bwar/CJsonObject

CJsonObject 是C++ CJSON 旧版本的新开发版本。CJsonObject最大的优点是重量轻、简单易用,开发效率很高。CJsonObject 比 CJSON 简单得多,更易于使用。

Bwar 首次使用 cJSON 是在 2013 年开发移动推送项目。当时,虽然cJSON很有用,但很容易忘记释放cJSON分配的内存。2014 年,Bwar 在开发另一个项目时再次使用 cJSON。为了提高cJSON的易用性,提高开发效率,对cJSON进行封装,支持64位整数。在CJsonObject的开发中,CJSON被稍微修改了。

5年来,CJsonObject在几个成功案例中验证了其稳定性。同时,CJsonObject集成到星云中,并得到广泛应用。

这里是一个维基常见问题的中文。

2. CJsonObject 的官方例程 demo.cpp

demo.cpp

#include <string>
#include <iostream>
#include "../CJsonObject.hpp"int main()
{int iValue;std::string strValue;neb::CJsonObject oJson("{\"refresh_interval\":60,""\"dynamic_loading\":[""{""\"so_path\":\"plugins/User.so\", \"load\":false, \"version\":1,""\"cmd\":[""{\"cmd\":2001, \"class\":\"neb::CmdUserLogin\"},""{\"cmd\":2003, \"class\":\"neb::CmdUserLogout\"}""],""\"module\":[""{\"path\":\"im/user/login\", \"class\":\"neb::ModuleLogin\"},""{\"path\":\"im/user/logout\", \"class\":\"neb::ModuleLogout\"}""]""},""{""\"so_path\":\"plugins/ChatMsg.so\", \"load\":false, \"version\":1,""\"cmd\":[""{\"cmd\":2001, \"class\":\"neb::CmdChat\"}""],""\"module\":[]""}""]""}");std::cout << oJson.ToString() << std::endl;std::cout << "-------------------------------------------------------------------" << std::endl;std::cout << oJson["dynamic_loading"][0]["cmd"][1]("class") << std::endl;oJson["dynamic_loading"][0]["cmd"][0].Get("cmd", iValue);std::cout << "iValue = " << iValue << std::endl;oJson["dynamic_loading"][0]["module"][0].Get("path", strValue);std::cout << "strValue = " << strValue << std::endl;std::cout << "-------------------------------------------------------------------" << std::endl;oJson.AddEmptySubObject("depend");oJson["depend"].Add("nebula", "https://github.com/Bwar/Nebula");oJson["depend"].AddEmptySubArray("bootstrap");oJson["depend"]["bootstrap"].Add("BEACON");oJson["depend"]["bootstrap"].Add("LOGIC");oJson["depend"]["bootstrap"].Add("LOGGER");oJson["depend"]["bootstrap"].Add("INTERFACE");oJson["depend"]["bootstrap"].Add("ACCESS");std::cout << oJson.ToString() << std::endl;std::cout << "-------------------------------------------------------------------" << std::endl;std::cout << oJson.ToFormattedString() << std::endl;
}

Makefile

CC = gcc
CXX = g++
CFLAGS = -g -O2
CXXFLAG =  -O2 -Wall -ggdb -m64 -D_GNU_SOURCE=1 -D_REENTRANT -D__GUNC__ ARCH:=$(shell uname -m)ARCH32:=i686
ARCH64:=x86_64ifeq ($(ARCH),$(ARCH64))
SYSTEM_LIB_PATH:=/usr/lib64
else
SYSTEM_LIB_PATH:=/usr/lib
endifVPATH = . ..
DIRS=$(VPATH)INC := $(INC) LDFLAGS := $(LDFLAGS) -D_LINUX_OS_ CPP_SRCS = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
C_SRCS = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) $(patsubst %.c,%.o,$(C_SRCS)) $(patsubst %.cc,%.o,$(CC_SRCS))TARGET = CJsonObjectTestall: $(TARGET)CJsonObjectTest:$(OBJS)$(CXX) -g -o $@ $^ $(LDFLAGS)%.o:%.cpp$(CXX) $(INC) $(CXXFLAG) -c -o $@ $< $(LDFLAGS)
%.o:%.cc$(CXX) $(INC) $(CXXFLAG) -c -o $@ $< $(LDFLAGS)
%.o:%.c$(CC) $(INC) $(CXXFLAG) -c -o $@ $< $(LDFLAGS)
clean:rm -f $(OBJS)rm -f $(TARGET)

运行

[root@lwh demo]# make
g++   -O2 -Wall -ggdb -m64 -D_GNU_SOURCE=1 -D_REENTRANT -D__GUNC__  -c -o demo.o demo.cpp  -D_LINUX_OS_
g++   -O2 -Wall -ggdb -m64 -D_GNU_SOURCE=1 -D_REENTRANT -D__GUNC__  -c -o ../CJsonObject.o ../CJsonObject.cpp  -D_LINUX_OS_
gcc   -O2 -Wall -ggdb -m64 -D_GNU_SOURCE=1 -D_REENTRANT -D__GUNC__  -c -o ../cJSON.o ../cJSON.c  -D_LINUX_OS_
g++ -g -o CJsonObjectTest demo.o ../CJsonObject.o ../cJSON.o  -D_LINUX_OS_
[root@lwh demo]# ls
CJsonObjectTest  demo.cpp  demo.o  Makefile[root@lwh demo]# ./CJsonObjectTest
{"refresh_interval":60,"dynamic_loading":[{"so_path":"plugins/User.so","load":false,"version":1,"cmd":[{"cmd":2001,"class":"neb::CmdUserLogin"},{"cmd":2003,"class":"neb::CmdUserLogout"}],"module":[{"path":"im/user/login","class":"neb::ModuleLogin"},{"path":"im/user/logout","class":"neb::ModuleLogout"}]},{"so_path":"plugins/ChatMsg.so","load":false,"version":1,"cmd":[{"cmd":2001,"class":"neb::CmdChat"}],"module":[]}]}
-------------------------------------------------------------------
neb::CmdUserLogout
iValue = 2001
strValue = im/user/login
-------------------------------------------------------------------
{"refresh_interval":60,"dynamic_loading":[{"so_path":"plugins/User.so","load":false,"version":1,"cmd":[{"cmd":2001,"class":"neb::CmdUserLogin"},{"cmd":2003,"class":"neb::CmdUserLogout"}],"module":[{"path":"im/user/login","class":"neb::ModuleLogin"},{"path":"im/user/logout","class":"neb::ModuleLogout"}]},{"so_path":"plugins/ChatMsg.so","load":false,"version":1,"cmd":[{"cmd":2001,"class":"neb::CmdChat"}],"module":[]}],"depend":{"nebula":"https://github.com/Bwar/Nebula","bootstrap":["BEACON","LOGIC","LOGGER","INTERFACE","ACCESS"]}}
-------------------------------------------------------------------
{"refresh_interval":     60,"dynamic_loading":      [{"so_path":      "plugins/User.so","load": false,"version":      1,"cmd":  [{"cmd":  2001,"class":        "neb::CmdUserLogin"}, {"cmd":  2003,"class":        "neb::CmdUserLogout"}],"module":       [{"path": "im/user/login","class":        "neb::ModuleLogin"}, {"path": "im/user/logout","class":        "neb::ModuleLogout"}]}, {"so_path":      "plugins/ChatMsg.so","load": false,"version":      1,"cmd":  [{"cmd":  2001,"class":        "neb::CmdChat"}],"module":       []}],"depend":       {"nebula":       "https://github.com/Bwar/Nebula","bootstrap":    ["BEACON", "LOGIC", "LOGGER", "INTERFACE", "ACCESS"]}
}
[root@lwh demo]#


3. CJsonObject 使用中遇到的问题


3.1 如何遍历json的key,并取其value?

std::string strTraversingKey;
std::string strTraversingValue;// while(oJson.GetKey(strTraversingKey)){}
// 每次!从oJson对象中取出一个key并把key设置进strTraversingKey
// 获取成功就返回true,当遍历完所有的key后,返回false
while (oJson.GetKey(strTraversingKey))
{// oJson.Get(strTraversingKey, strTraversingValue) // 从oJson对象中取出key=strTraversingKey对应的value,// 并把value设置进strTraversingValueif (oJson.Get(strTraversingKey, strTraversingValue)){std::cout << strTraversing << "  :  " << strTraversingValue << std::endl;}
}

GetKey()遍历不适用于数组,对json数组调用GetKey()将直接返回false。

调用GetKey()函数循环遍历获取当前所在层次的json key,GetKey()返回false表示已取完最后一个key,下次遍历再调用GetKey()将重新从第一个key开始获取。换一种说法,GetKey()遍历json key的返回结果为:true,true,true … true,false; true,true,true … true,false; true,true,true … true,false; 想要遍历多少轮完全由用户自己决定。

如果需要中断一次遍历并重新开始,可以调用ResetTraversing()函数重置遍历。

std::string strTraversingKey;
std::string strTraversingValue;
while(oJson.GetKey(strTraversingKey))
{if (strTraversingKey == "Auguest"){oJson.ResetTraversing();break;}if (oJson.Get(strTraversingKey, strTraversingValue)){std::cout << strTraversing << "  :  " << strTraversingValue << std::endl;}
}// 因为上一个遍历中断时调用了ResetTraversing(),所以本次遍历又是从第一个key开始。如果上一个遍历中断时未调用ResetTraversing(),那这次遍历将是从上次终端的位置继续,这通常不是遍历的预期结果,因此,中断遍历时记得ResetTraversing()。
while(oJson.GetKey(strTraversingKey))
{if (oJson.Get(strTraversingKey, strTraversingValue)){std::cout << strTraversing << "  :  " << strTraversingValue << std::endl;}
}

__注意:__对Json当前层次的key进行Add()或Delete()操作,将导致当前遍历失效,下次调用GetKey()将获取key从头开始。


3.2 Replace一个key时,是否需要原value类型与替换后value类型一致?

Replace()函数对key进行替换,跟value类型无关。

把一个value为int的替换为value为string,或将value替换为object或array都是可以的。但如非必要,建议替换后的value类型跟替换前的value类型相同。


3.3 []和()的重载有什么区别,为什么要重载这两个操作符?

[]的重载是操作JsonObject或JsonArray的,为了方便一层一层往下取嵌套的json,不适用于string、int等基本json类型;

()的重载是Get()系列函数的更便捷的调用,如果十分肯定key是存在的不需要通过Get()的返回值判断是否获取成功,调用()比调用Get()编码要快,不适用于操作JsonObject或JsonArray。

[]和()返回值是不一样的,两者不能混用。


3.4 如何用CJsonObject创建类似以下二维数组?

{"test":[[{"test":1}],[{"test":2}]]
}

CJsonObject对多层嵌套json的操作非常灵活方便,对嵌套json的生成和读取有许多种灵活用法。

neb::CJsonObject oTest;
oTest.AddEmptySubArray("test");
for (int i = 1; i < 3; ++i)
{neb::CJsonObject oDimension1;neb::CJsonObject oDimension2;oDimension2.Add("test", i);oDimension1.Add(oDimension2);oTest["test"].Add(oDimension1);
}
std::cout << oTest.ToString() << std::endl;

3.5 请问一下使用CJsonObject如何创建如下形式的数组?

{"employees": [{ "firstName":"John" , "lastName":"Doe" },{ "firstName":"Anna" , "lastName":"Smith" },{ "firstName":"Peter" , "lastName":"Jones" }]
}

这里给出三种生成上述json数组的方式:

neb::CJsonObject oJson;
oJson.AddEmptySubArray("employees");
oJson["employees"].Add(neb::CJsonObject("{\"firstName\":\"John\" , \"lastName\":\"Doe\"}"));
oJson["employees"].Add(neb::CJsonObject("{\"firstName\":\"Anna\" , \"lastName\":\"Smith\"}"));
oJson["employees"].Add(neb::CJsonObject("{\"firstName\":\"Peter\" , \"lastName\":\"Jones\"}"));
neb::CJsonObject oJson;
oJson.AddEmptySubArray("employees");
oJson["employees"].Add(neb::CJsonObject("{}"));
oJson["employees"][0].Add("firstName", "John");
oJson["employees"][0].Add("lastName", "Doe");
oJson["employees"].Add(neb::CJsonObject("{}"));
oJson["employees"][1].Add("firstName", "Anna");
oJson["employees"][1].Add("lastName", "Smith");
oJson["employees"].Add(neb::CJsonObject("{}"));
oJson["employees"][2].Add("firstName", "Peter");
oJson["employees"][2].Add("lastName", "Jones");
neb::CJsonObject oJson;
neb::CJsonObject oJohn;
neb::CJsonObject oAnna;
neb::CJsonObject oPeter;
oJohn.Add("firstName", "John");
oJohn.Add("lastName", "Doe");
oAnna.Add("firstName", "Anna");
oAnna.Add("lastName", "Smith");
oPeter.Add("firstName", "Peter");
oPeter.Add("lastName", "Jones");
oJson.AddEmptySubArray("employees");
oJson["employees"].Add(oJohn);
oJson["employees"].Add(oAnna);
oJson["employees"].Add(oPeter);


JSON-02 CJsonObject 及 CJsonObject 的官方例程 demo.cpp相关推荐

  1. 【QCustomPlot】1.3 - 运行官方例程Demo,介绍功能

    Qt运行了一遍QCustomPlot官方例程,并记录下功能,以节约大家再次运行花费时间.需要什么功能直接去找对应的代码. 官方Demo 1. axis-tags 动态绘图,无鼠标动作. 2. inte ...

  2. DPDK官方例程分析(4)-flow_classify

    前言 Flow Classify示例应用程序基于转发应用程序的简单框架示例. 它旨在演示使用Flow Classify库API的DPDK转发应用程序的基本组件 flow_classify例子对于DPD ...

  3. STM32F407开发板的HTTP模式IAP远程升级之官方例程移植

    版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/wbdxz/article/details/82859237 关于远程升级的模板建立,可以参考下面的博文 ST ...

  4. harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

    HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验 硬件平台 基于正点原子战舰V3开发板 MCU:STM32F103ZET6 片上SRAM大小:64KBytes 片上FLASH大小 ...

  5. stm32之USB应用实例(官方例程资料下载使用)

    开发环境:Window 7 开发工具:Keil uVision5 硬件:stm32f103c8t6 stm32系列芯片很多都拥有一个USB2.0全速的通讯接口,下面介绍怎么使用st官方的usb应用例程 ...

  6. 低功耗STM32F411开发板(原理图+PCB源文件+官方例程+驱动等)

    http://www.cirmall.com/circuit/2174/低功耗STM32F411开发板%EF%BC%88原理图%2BPCB源文件%2B官方例程%2B驱动等%EF%BC%89#/deta ...

  7. PSIM软件BUCK转换数字控制官方例程

      在使用PSIM软件仿真开关电源时,大多数都是模拟电路,纯数字电路的仿真很少.无意间发现了在PSIM 2021版本中有官方的数字控制BUCK电路仿真.电路使用简单C模块编写的代码来控制电路.   由 ...

  8. STM32 HAL库手册获取和查阅方法以及查看官方例程

    目录 一.概述 二.安装芯片pack包 三.查看HAL库手册 四.查看官方例程 一.概述 STM32固件使用HAL库进行开发,如何查看接口函数的定义呢?本文记录一种通过STM32CubeMX软件获取H ...

  9. 一天上手Aurora 8B/10B IP核(4)----从Streaming接口的官方例程学起

    Xilinx的技术生态做的非常好,基本上所有常用的IP核都有官方例程(example design)供开发者学习,咱不用白不用,今儿咱就一起白嫖他一手----从官方例程开始学习如何具体使用这个IP核. ...

最新文章

  1. 如何设置VSS源代码管理工具使用KDiff3
  2. Qt之QFutureWatcher
  3. 深入浅出全面解析RDMA
  4. 趣链 BitXHub跨链平台 (8)交易验证
  5. 二十万字C/C++、嵌入式软开面试题全集宝典十一
  6. 做百度AI工程师,还要会“相牛”?
  7. PyTorch 模型训练实用教程(附代码)
  8. 串匹配模式中的BF算法和KMP算法
  9. 书生浏览器不能打开这个文件或者url_这些浏览器工作原理你都吃透了吗?
  10. 怎么用计算机算全勤奖,全勤奖计算与发放细则
  11. 【数学】3D数学基础
  12. 这4款适合原型图的软件,产品经理都说好
  13. 理正深基坑6.0软件备忘录_梳理使用方法01
  14. c语言色环电阻计算器源代码,色环电阻在线计算器
  15. 笔记本电脑发射无线信号的操作步骤及命令
  16. 1050Ti解决csgo打不开、电脑无缘无故蓝屏的终极方法
  17. 使用朴素贝叶斯对电影评论分类
  18. 岁月温柔-12 妈妈害怕去医院-疑似有医院恐惧症
  19. 富士康本科计算机,富士康计算机 南开大学【深圳成考】
  20. IntelliJ IDEA代码review常用plugins

热门文章

  1. 轻量应用服务器VS云服务器ECS:一图看完它们的区别
  2. opencv reshape 深拷贝 浅拷贝之坑
  3. 【格式转换程序软件集】---[A2B]---集中收集-不断更新[2008-3-29] 软件 软件 杭州志彬电脑维修网
  4. 基于STM32的数显温度计设计
  5. A. Vova and Train
  6. 佳能iP2780 评测
  7. ChatGPT 调教指南
  8. gxh-3051c程序win10安装
  9. 2021蕲春益才中学高考成绩查询,携手并肩 再谱新篇 | 黄冈市益才国际学校高中部2020—2021学年秋季期末线上家长会...
  10. 算法学习 - 最长公共子序列(LCS)C++实现