下载:https://github.com/open-source-parsers/jsoncpp/tree/1.9.0
直接贴代码吧
#include <stdio.h>
#include <assert.h>
#include <string>
#include <algorithm>
#include <fstream>
#include <iostream>
#include "json/json.h"
using namespace std;
std::string createJson(void)
{
std::string jsonStr;
Json::Value root, language, mail;
Json::StreamWriterBuilder writerBuilder;
std::ostringstream os;
// 设置默认无格式化的输出
writerBuilder.settings_["indentation"] = "";
root["Name"] = "Zhangsan";
root["Age"] = 25;
language[0] = "C";
language[1] = "C++";
root["Language"] = language;
mail["QQ"] = "zhangsan@qq.com";
mail["Google"] = "san.zhang@gmail.com";
root["E-mail"] = mail;
root["Industry"] = "IT";
// jsonWriter是智能指针, 当jsonWriter被析构时, 它所指向的对象(内存)也被自动释放
std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
jsonWriter->write(root, &os);
jsonStr = os.str();
// 无格式化的输出
std::cout << "Json-none:\n" << jsonStr << std::endl;
// 格式化的输出
std::cout << "Json-formatted:\n" << root.toStyledString() << std::endl;
return jsonStr;
}
std::string createJsonArray(void)
{
std::string jsonStr;
Json::Value root, person, language, mail;
Json::StreamWriterBuilder writerBuilder;
std::ostringstream os;
// 设置默认无格式化的输出
writerBuilder.settings_["indentation"] = "";
person["Name"] = "Zhangsan";
person["Age"] = 25;
language[0] = "C";
language[1] = "C++";
person["Language"] = language;
mail["QQ"] = "zhangsan@qq.com";
mail["Google"] = "san.zhang@gmail.com";
person["E-mail"] = mail;
person["Industry"] = "IT";
root.append(person);
person["Name"] = "Lisi";
person["Age"] = 28;
language[0] = "Chinese";
language[1] = "English";
person["Language"] = language;
mail["QQ"] = "lisi@163.com";
mail["Google"] = "si.li@gmail.com";
person["E-mail"] = mail;
person["Industry"] = "Finance";
root.append(person);
// jsonWriter是智能指针, 当jsonWriter被析构时, 它所指向的对象(内存)也被自动释放
std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
jsonWriter->write(root, &os);
jsonStr = os.str();
// 无格式化的输出
std::cout << "Json-array-none:\n" << jsonStr << std::endl;
// 格式化的输出
std::cout << "Json-array-formatted:\n" << root.toStyledString() << std::endl;
return jsonStr;
}
bool parseJsonFromString(const std::string &jsonStr)
{
if (jsonStr.empty())
{
return false;
}
bool res;
JSONCPP_STRING errs;
Json::Value root, language, mail;
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
res = jsonReader->parse(jsonStr.c_str(), jsonStr.c_str()+jsonStr.length(), &root, &errs);
if (!res || !errs.empty())
{
std::cout << "parseJsonFromString error! " << errs << std::endl;
return false;
}
std::cout << "root.size() = " << root.size() << std::endl;
std::cout << "Name: " << root["Name"].asString() << std::endl;
std::cout << "Age: " << root["Age"].asInt() << std::endl;
language = root["Language"];
std::cout << "Language: ";
for (int i = 0; i < language.size(); ++i)
{
std::cout << language[i].asString() << " ";
}
std::cout << std::endl;
mail = root["E-mail"];
std::cout << "E-mail: " << std::endl;
std::cout << "QQ: " << mail["QQ"].asString() << std::endl;
std::cout << "Google: " << mail["Google"].asString() << std::endl;
std::cout << "Industry: " << root["Industry"].asString() << std::endl;
return true;
}
bool parseJsonArrayFromString(const std::string &jsonStr)
{
if (jsonStr.empty())
{
return false;
}
bool res;
JSONCPP_STRING errs;
Json::Value root, person, language, mail;
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
res = jsonReader->parse(jsonStr.c_str(), jsonStr.c_str()+jsonStr.length(), &root, &errs);
if (!res || !errs.empty())
{
std::cout << "parseJsonFromString error! " << errs << std::endl;
return false;
}
std::cout << "root.size() = " << root.size() << std::endl;
for(int i = 0; i < root.size(); ++i)
{
person = root[i];
std::cout << "Name: " << person["Name"].asString() << std::endl;
std::cout << "Age: " << person["Age"].asInt() << std::endl;
language = person["Language"];
std::cout << "Language: ";
for (int i = 0; i < language.size(); ++i)
{
std::cout << language[i].asString() << " ";
}
std::cout << std::endl;
mail = person["E-mail"];
std::cout << "E-mail: " << std::endl;
std::cout << "QQ: " << mail["QQ"].asString() << std::endl;
std::cout << "Google: " << mail["Google"].asString() << std::endl;
std::cout << "Industry: " << person["Industry"].asString() << std::endl;
}
return true;
}
void parseJsonArrayFromFile(const char *file)
{
std::string line, jsonStr;
std::ifstream ifs(file);
assert(ifs.is_open());
while(getline(ifs, line))
{
jsonStr.append(line);
}
ifs.close();
parseJsonArrayFromString(jsonStr);
}
void saveJsonStringToFile(const char *file, string &jsonStr)
{
std::ofstream ofs;
ofs.open(file);
assert(ofs.is_open());
ofs << jsonStr;
ofs.close();
}
// g++ -std=c++11 -I./include -L./lib -ljsoncpp json_test.cpp
int main()
{
std::string jsonStr;
jsonStr = createJson();
saveJsonStringToFile("/tmp/json-none.json", jsonStr);
std::cout << "**********************************" << std::endl;
parseJsonFromString(jsonStr);
std::cout << "**********************************" << std::endl;
std::string jsonStrArray = createJsonArray();
saveJsonStringToFile("/tmp/json-none-array.json", jsonStrArray);
std::cout << "**********************************" << std::endl;
parseJsonArrayFromString(jsonStrArray);
std::cout << "**********************************" << std::endl;
parseJsonArrayFromFile("/tmp/json-none-array.json");
return 0;
}
测试结果
Json-none:
{"Age":25,"E-mail":{"Google":"san.zhang@gmail.com","QQ":"zhangsan@qq.com"},"Industry":"IT","Language":["C","C++"],"Name":"Zhangsan"}
Json-formatted:
{
"Age" : 25,
"E-mail" :
{
"Google" : "san.zhang@gmail.com",
"QQ" : "zhangsan@qq.com"
},
"Industry" : "IT",
"Language" :
[
"C",
"C++"
],
"Name" : "Zhangsan"
}
**********************************
root.size() = 5
Name: Zhangsan
Age: 25
Language: C C++
E-mail:
QQ: zhangsan@qq.com
Google: san.zhang@gmail.com
Industry: IT
**********************************
Json-array-none:
[{"Age":25,"E-mail":{"Google":"san.zhang@gmail.com","QQ":"zhangsan@qq.com"},"Industry":"IT","Language":["C","C++"],"Name":"Zhangsan"},{"Age":28,"E-mail":{"Google":"si.li@gmail.com","QQ":"lisi@163.com"},"Industry":"Finance","Language":["Chinese","English"],"Name":"Lisi"}]
Json-array-formatted:
[
{
"Age" : 25,
"E-mail" :
{
"Google" : "san.zhang@gmail.com",
"QQ" : "zhangsan@qq.com"
},
"Industry" : "IT",
"Language" :
[
"C",
"C++"
],
"Name" : "Zhangsan"
},
{
"Age" : 28,
"E-mail" :
{
"Google" : "si.li@gmail.com",
"QQ" : "lisi@163.com"
},
"Industry" : "Finance",
"Language" :
[
"Chinese",
"English"
],
"Name" : "Lisi"
}
]
**********************************
root.size() = 2
Name: Zhangsan
Age: 25
Language: C C++
E-mail:
QQ: zhangsan@qq.com
Google: san.zhang@gmail.com
Industry: IT
Name: Lisi
Age: 28
Language: Chinese English
E-mail:
QQ: lisi@163.com
Google: si.li@gmail.com
Industry: Finance
**********************************
root.size() = 2
Name: Zhangsan
Age: 25
Language: C C++
E-mail:
QQ: zhangsan@qq.com
Google: san.zhang@gmail.com
Industry: IT
Name: Lisi
Age: 28
Language: Chinese English
E-mail:
QQ: lisi@163.com
Google: si.li@gmail.com
Industry: Finance