两种库解析、构造 JSON
1.用CJSON库
1.1解析Json
需要解析的JSON文件:
{
"name":"Tsybius",
"age":,
"sex_is_male":true,
"partner":
{
"partner_name":"Galatea",
"partner_age":,
"partner_sex_is_male":false
},
"achievement":["ach1","ach2","ach3"]
}
解析代码(层次解析法)
/* 读取JSON格式的文件到string */
ULONG_32 TMS_C_ReadJSONFile(const std::string ostrFileName, std::string &ostrJSON)
{
std::ifstream oInFile;
oInFile.open(ostrFileName.data()); //将文件流对象与文件连接起来
std::string strText;
while (getline(oInFile, strText))
{
ostrJSON += strText;
}
oInFile.close(); return ;
}
int main()
{
//str 为从文件中读取到的值
std::string str = "{\"name\":\"Tsybius\",\"age\":23,\"sex_is_male\":true, \"partner\":{\"partner_name\":\"Galatea\",\"partner_age\":21,\"partner_sex_is_male\":false},\"achievement\":[\"ach1\",\"ach2\",\"ach3\"]}"; //转换为整个Json
cJSON *returnjson = cJSON_Parse(str.c_str());
if (NULL == returnjson)
{
return ;
} // 获取根节点下的某个值
cJSON * name = cJSON_GetObjectItem(returnjson, "name");
if(NULL == name)
{
return ;
}
std::string str1 = name->valuestring;
std::cout << str1 << std::endl; // 获取子节点
cJSON * partner = cJSON_GetObjectItem(returnjson, "partner");
if(NULL == partner)
{
return ;
} // 获取子节点下的某个值
cJSON * partner_name = cJSON_GetObjectItem(partner, "partner_name");
if(NULL == partner_name)
{
return ;
}
std::string str2 = partner_name->valuestring;
std::cout << str2 << std::endl; // 获取子节点下的数组
cJSON * achievement = cJSON_GetObjectItem(returnjson, "achievement");
if(NULL == achievement)
{
return ;
}
cJSON *pArrayItem = NULL;
pArrayItem = cJSON_GetArrayItem(achievement, );
std::string str3 = pArrayItem->valuestring;
int i = cJSON_GetArraySize(achievement); //获取数组大小 cJSON_Delete(returnjson); // 注意cJSON的内存泄漏
system("pause"); return ; }
1.2构造Json
#include <fstream>
#include <string>
#include <vector>
#include "cJSON.h"
int main()
{
int ulRet = ;
std::string ostrJSONFilePath1 = "F:\\1.txt";
//ulRet = TMS_C_ReadJSONFile(ostrJSONFilePath1); cJSON *pJsonVehicleInfo = NULL;
//也可以先创建数组,然后添加元素,构造为数组对象
pJsonVehicleInfo = cJSON_CreateObject();
cJSON *vehicleList = NULL;
cJSON_AddItemToObject(pJsonVehicleInfo, "MotorVehicleObjectList", vehicleList = cJSON_CreateArray()); cJSON *subdir = NULL; cJSON_AddItemToArray(vehicleList, subdir = cJSON_CreateObject()); cJSON_AddStringToObject(subdir, "MotorVehicleID", "");
cJSON_AddNumberToObject(subdir, "InfoKind", );
cJSON_AddStringToObject(subdir, "SourceID", "");
cJSON_AddStringToObject(subdir, "TollgateID", ""); cJSON *SubImageObject = NULL;
cJSON_AddItemToObject(subdir, "SubImageObject", SubImageObject = cJSON_CreateObject()); cJSON *picList = NULL;
cJSON_AddItemToObject(SubImageObject, "SubImageInfoList", picList = cJSON_CreateArray());
cJSON *sub = NULL;
cJSON_AddItemToArray(picList, sub = cJSON_CreateObject());
cJSON_AddStringToObject(sub, "pic1", "pic1");
cJSON_AddStringToObject(sub, "pic2", "pic2");
sub = NULL;
cJSON_AddItemToArray(picList, sub = cJSON_CreateObject());
cJSON_AddStringToObject(sub, "pic3", "pic3");
cJSON_AddStringToObject(sub, "pic4", "pic4"); /* JSON转为字符串 */
char * responeJSONbuffer = cJSON_Print(pJsonVehicleInfo); std::string ostrJSONFilePath = "F:\\3.txt";
std::ofstream oOutFile;
oOutFile.open(ostrJSONFilePath.data());
oOutFile << responeJSONbuffer << std::endl;
oOutFile.close();
cJSON_Delete(pJsonVehicleInfo); // 注意cJSON的内存泄漏,只需要释放根节点即可
system("pause");
return ;
}
构造后输出的文档
{
"MotorVehicleObjectList": [{
"MotorVehicleID": "",
"InfoKind": ,
"SourceID": "",
"TollgateID": "",
"SubImageObject":
{
"SubImageInfoList":
[
{
"pic1": "pic1",
"pic2": "pic2"
},
{
"pic3": "pic3",
"pic4": "pic4"
}
]
}
}]
}
2. 用jsoncpp.zip
2.1获取json第三方工具
下载 jsoncpp.zip ,解压后可在vs下建立新的工程进行编译,注意设置 配置熟悉》c/c++》代码生成》运行时库为MTd(使用该库的工程也这样设置),编译后将 lib 文件放入工程目录,将 jsoncpp\include整个文件放入工程中的文件(使用lib时需要引用该库文件文件的头文件)。
2.2 从文件中解析JSON
需要解析的JSON文件:
{
"name":"Tsybius",
"age":,
"sex_is_male":true,
"partner":
{
"partner_name":"Galatea",
"partner_age":,
"partner_sex_is_male":false
},
"achievement":["ach1","ach2","ach3"]
}
方法1:整体解析法
#include <iostream>
#include <fstream>
#include "json/json.h"
using namespace std; int main()
{
Json::Reader reader;
Json::Value root;
//从文件中读取
ifstream is;
is.open("PersonalInfo.json", ios::binary);
if(reader.parse(is,root))
{
//读取根节点信息
string name = root["name"].asString();
int age = root["age"].asInt();
bool sex_is_male = root["sex_is_male"].asBool(); //读取子节点信息
string partner_name = root["partner"]["partner_name"].asString();
int partner_age = root["partner"]["partner_age"].asInt();
bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool(); //读取数组信息
cout << "Here's my achievements:" << endl;
for(int i = ; i < root["achievement"].size(); i++)
{
// 严重的bug, string ach = root["achievement"][0].asString(); 写成这样无法编译,如果索引是0,则必须用变量替代
string ach = root["achievement"][i].asString();
cout << ach << '\t';
}
}
is.close(); system("pause");
return ;
}
方法2:层次解析法,见CJSON库的使用
2.3将信息保存为JSON格式
code
#include <iostream>
#include <fstream>
#include "json/json.h"
using namespace std; int main()
{
//根节点
Json::Value root; //根节点属性
root["name"] = Json::Value("Tsybius");
root["age"] = Json::Value();
root["sex_is_male"] = Json::Value(true); //子节点
Json::Value partner; //子节点属性
partner["partner_name"] = Json::Value("Galatea");
partner["partner_age"] = Json::Value();
partner["partner_sex_is_male"] = Json::Value(false); //子节点挂到根节点上
root["partner"] = Json::Value(partner); //数组形式
root["achievement"].append("ach1");
root["achievement"].append("ach2");
root["achievement"].append("ach3"); //数组对象
//Json::Value array;
//array["arr1"] = Json::Value(1);
//array["arr2"] = Json::Value(2);
//root["achievement"].append(array); //可以直接将对象追加到数组中,构成[{...},{...}] 格式 //直接输出
cout << "FastWriter:" << endl;
Json::FastWriter fw;
cout << fw.write(root) << endl << endl; //缩进输出
cout << "StyledWriter:" << endl;
Json::StyledWriter sw;
cout << sw.write(root) << endl << endl; //输出到文件
ofstream os;
os.open("PersonalInfo");
os << sw.write(root);
os.close(); system("pause");
return ;
}
保存的文件 :
{
"achievement" : [ "ach1", "ach2", "ach3" ],
"age" : ,
"name" : "Tsybius",
"partner" : {
"partner_age" : ,
"partner_name" : "Galatea",
"partner_sex_is_male" : false
},
"sex_is_male" : true
}
两种库解析、构造 JSON的更多相关文章
- Oracle 使用GSON库解析复杂json串
在前文中讲到了如何使用JSON标准库解析json串,参考: Oracle解析复杂json的方法(转) 现补充一篇使用GSON库在Oracle中解析复杂json的方法. GSON串的使用教程参考官方文档 ...
- 解析JSON的两种方法eval()和JSON.parse()
解析JSON 一种方法是使用eval函数. var dataObj = eval("("+json+")"); 必须把文本包围在括号中,这样才能避免语法错误,迫 ...
- golang使用simplejson库解析复杂json
cnblogs原创 golang自带的json解析库encoding/json提供了json字符串到json对象的相互转换,在json字符串比较简单的情况下还是挺好用的,但是当json字符串比较复杂或 ...
- 示例说明Oracle RMAN两种库增量备份的差别
1差异增量实验示例 1.1差异增量备份 为了演示增量备份的效果,我们在执行一次0级别的备份后,对数据库进行一些改变. 再执行一次1级别的差异增量备份: 执行完1级别的备份后再次对数据库进行更改: 再执 ...
- ajax 另外两种返回类型(json xml)
返回json类型(例子): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- Redis:存储对象的两种方式(序列化和json字符串)
方式一:序列化操作 public class SerializeUtil { /* * 序列化 * */ public static byte[] serizlize(Object ...
- scrapy爬虫提取网页链接的两种方法以及构造HtmlResponse对象的方式
Response对象的几点说明: Response对象用来描述一个HTTP响应,Response只是一个基类,根据相应的不同有如下子类: TextResponse,HtmlResponse,XmlRe ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- Java解析Json数据的两种方式
JSON数据解析的有点在于他的体积小,在网络上传输的时候可以更省流量,所以使用越来越广泛,下面介绍使用JsonObject和JsonArray的两种方式解析Json数据. 使用以上两种方式解析json ...
随机推荐
- 饮冰三年-人工智能-Python-23 Python PyCharm 使用中常见的问题
一:软件工具使用中遇到的问题 1:AttributeError: module 'pip' has no attribute 'main'问题 处理方法: a:找到JetBrains\PyCharm ...
- 如何在cocos中为节点添加监听事件
一般在监听键盘事件时,可是采用以下方式来监听键盘事件: 以及记得定义取消监听的函数(这个摧毁函数会自己调用吗?): 同时这里还有一种传统的监听方式: 但是cocos官方的文档建议我们不要使用这种方式, ...
- Android人脸检测1(静态图片)
搭建Android人脸识别环境花了很长时间(可以查看之前的文章),解决Android开发中的杂七杂八小问题也耗时不少. 今天记录一下,点击选择照片或者拍照上传照片进行人脸检测的小demo. (andr ...
- <WebGIS之OpenLayers全面解析>示例程序运行问题
运行<WebGIS之OpenLayers全面解析>中的示例程序时,无法加载*.json文件. 查看到提示如下错误:GET http://localhost:11232/demos/data ...
- manjaro安装及设置
因我的笔记本(联想的拯救者)昨晚打开后什么都还没做就被更新系统“抢走”了画面导致按什么都不管用 所以就想起能不能不用win系统,都知道linux比win稳定,so....就找到了manjaro.以下是 ...
- 网络编程-Mysql-1、数据库的启动关闭,创建数据库,表等基本操作
启动服务端:sudo service mysql start 关闭服务端:suodo service mysql stop 重启服务端:suodo service mysql restart 连接数据 ...
- LINUX更改桌面的分辨率
命令行 输入xrandr 输入xrandr命令后可以看到系统的一些分辨率的列表, 和当前系统屏幕的分辨率信息,可以通过命令的 相应参数对系统分辨率的一些设置操作. xrandr -s 0 全屏 xra ...
- 一道dfs和dp结合的好题 --- Longest Run on a SnowboardUVA-10285
题目链接: https://vjudge.net/problem/19213/origin 大致题意: 一个滑雪者想知道自己在固定高度的山坡中最多能滑的距离是多少. 思路: 首先想到的就是dfs,但是 ...
- django——url(路由)配置
URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除此之外的任何URL都不被 ...
- Navicat premium 破解步骤
测试环境:MacOS High Sierra 10.13.3Windows版破解教程请看 https://www.52pojie.cn/thread-688820-1-1.html 破解思路依然是替换 ...