cpp程序使用jsoncpp对json格式数据序列化和反序列化操作

1.Json介绍

JSON: JavaScript Object Notation(JavaScript 对象表示法),是存储和交换文本信息的语法。它类似 XML,但比 XML 更小、更快,更易解析。

JSON 是轻量级的文本数据交换格式,独立于语言,具有自我描述性,更易理解。

JSON 文本格式在语法上与创建 JavaScript 对象的代码相同,由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。

语法规则

数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组

例如:
var sites = [
{ “name”:“foo” , “url”:“www.foo.com” },
{ “name”:“google” , “url”:“www.google.com” },
{ “name”:“微博” , “url”:“www.weibo.com” }
];

2.jsoncpp下载

c++中有多种方法可以解析json数据,包括Jsoncpp和Boost库的property_tree。
Jsoncpp是个跨平台的开源库,使用的比较多。

下载jsoncpp源码地址:https://sourceforge.net/projects/jsoncpp/files/latest/download
编译生成json_vc71_libmt.lib
下载编译好的json_vc71_libmt.lib
下载地址:https://download.csdn.net/download/cn_cpp001/13218456

3.jsoncpp使用

#include <stdio.h>
#include <assert.h>
#include
#include
#include
#include
#include “json/json.h”
#pragma comment(lib, “json_vc71_libmt.lib”)
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"] = "XiaoMing";
root["Age"] = 18;

language[0] = "C";
language[1] = "Cpp";
root["Language"] = language;

mail["QQ"] = "XiaoMing@qq.com";
mail["Google"] = "XiaoMing@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"] = "XiaoMing";
person["Age"] = 18;

language[0] = "C";
language[1] = "Cp'p";
person["Language"pp language;

mail["QQ"] = "XiaoMing@qq.com";
mail["Google"] = "XiaoMing@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(int argc, char* argv[])
{
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”:18,“E-mail”:{“Google”:“XiaoMing@gmail.com”,“QQ”:“XiaoMing@qq.com”},“Industry”:“IT”,“Language”:[“C”,“Cpp”],“Name”:“XiaoMing”}
Json-formatted:
{
“Age” : 18,
“E-mail” :
{
“Google” : “XiaoMing@gmail.com”,
“QQ” : “XiaoMing@qq.com”
},
“Industry” : “IT”,
“Language” :
[
“C”,
“Cpp”
],
“Name” : “XiaoMing”
}


root.size() = 5
Name: XiaoMing
Age: 18
Language: C Cpp
E-mail:
QQ: XiaoMing@qq.com
Google: XiaoMing@gmail.com
Industry: IT


Json-array-none:
[{“Age”:18,“E-mail”:{“Google”:“XiaoMing@gmail.com”,“QQ”:“XiaoMing@qq.com”},“Industry”:“IT”,“Language”:[“C”,“Cpp”],“Name”:“XiaoMing”},{“Age”:28,“E-mail”:{“Google”:“si.li@gmail.com”,“QQ”:“lisi@163.com”},“Industry”:“Finance”,“Language”:[“Chinese”,“English”],“Name”:“Lisi”}]
Json-array-formatted:
[
{
“Age” : 18,
“E-mail” :
{
“Google” : “XiaoMing@gmail.com”,
“QQ” : “XiaoMing@qq.com”
},
“Industry” : “IT”,
“Language” :
[
“C”,
“Cpp”
],
“Name” : “XiaoMing”
},
{
“Age” : 28,
“E-mail” :
{
“Google” : “si.li@gmail.com”,
“QQ” : “lisi@163.com”
},
“Industry” : “Finance”,
“Language” :
[
“Chinese”,
“English”
],
“Name” : “Lisi”
}
]


root.size() = 2
Name: XiaoMing
Age: 18
Language: C Cpp
E-mail:
QQ: XiaoMing@qq.com
Google: XiaoMing@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: XiaoMing
Age: 18
Language: C Cpp
E-mail:
QQ: XiaoMing@qq.com
Google: XiaoMing@gmail.com
Industry: IT
Name: Lisi
Age: 28
Language: Chinese English
E-mail:
QQ: lisi@163.com
Google: si.li@gmail.com
Industry: Finance

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值