摘要:本篇C++语言教程将为大家讲解C++ json解析,看完这篇文章会让你对C++语言的知识点有更加清晰的理解和运用。
本篇C++语言教程将为大家讲解C++ json解析,看完这篇文章会让你对C++语言的知识点有更加清晰的理解和运用。
利用jsoncpp来做json的解析。
1.jsoncpp下载
从https://sourceforge.net/projects/jsoncpp/ 下载jsoncpp。makefiles目录下面有VS的工程。
2.写到string
string test_write()
{
Json::Value root; // 表示整个 json 对象
root["platenumber"] = Json::Value("value_string");
root["platetype"] = Json::Value(0);
root["snopshotplaceid"] = Json::Value("12345678");
root["snopshottime"] = Json::Value("20171222");
root["platenumber"] = Json::Value("123456");
root["imgpath"] = Json::Value("D:/TEST.JPG");
root["extFlag"] = Json::Value("EXTFLAG");
root["taskid"] = Json::Value("TASKID");
Json::ValueType type = root.type(); // 获得 root 的类型,此处为 objectValue 类型。
Json::StyledWriter styled_writer;
string strJson = GBKToUTF8(styled_writer.write(root));
const char* chData = strJson.c_str();
cout << strJson << endl;
return strJson;
}
其中多字节下,GBK转UTF8
string GBKToUTF8(const std::string& strGBK)
{
string strOutUTF8 = "";
WCHAR * str1;
int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
str1 = new WCHAR[n];
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char * str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
strOutUTF8 = str2;
delete[]str1;
str1 = NULL;
delete[]str2;
str2 = NULL;
return strOutUTF8;
}
2.从string解析json
void test_read(string str)
{
string str_json = Utf8ToGbk(str.c_str());
Json::Reader reader;
Json::Value root;
if (reader.parse(str_json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::cout << "========================[Dispatch]========================" << std::endl;
std::string plate_number = root["platenumber"].asString();
int plate_type = root["platetype"].asInt();
std::string snopshot_place_id = root["snopshotplaceid"].asString();
std::string snopshot_time = root["snopshottime"].asString();
std::string image_path = root["imgpath"].asString();
std::string extFlag = root["extFlag"].asString();
std::string taskid = root["taskid"].asString();
cout << "plate_number :" << plate_number << endl;
cout << "plate_type :" << plate_type << endl;
cout << "snopshot_place_id :" << snopshot_place_id << endl;
cout << "snopshot_time :" << snopshot_time << endl;
cout << "image_path :" << image_path << endl;
cout << "extFlag :" << extFlag << endl;
cout << "taskid :" << taskid << endl;
cout << endl;
}
}
其中,多字节下UTF8转GBK
std::string Utf8ToGbk(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
}
3.完整示例
// mytest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <Windows.h>
#include "..\\..\\include\\json\\writer.h" //json解析
#include "..\\..\\include\\json\\reader.h" //json解析
#ifdef _DEBUG
#pragma comment(lib, "..\\..\\build\\vs71\\debug\\lib_json\\json_vc71_libmtd.lib")
#else
#pragma comment(lib, "..\\..\\build\\vs71\\release\\lib_json\\json_vc71_libmt.lib")
#endif
using namespace std;
string GBKToUTF8(const std::string& strGBK)
{
string strOutUTF8 = "";
WCHAR * str1;
int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
str1 = new WCHAR[n];
MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
char * str2 = new char[n];
WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
strOutUTF8 = str2;
delete[]str1;
str1 = NULL;
delete[]str2;
str2 = NULL;
return strOutUTF8;
}
std::string Utf8ToGbk(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
}
string test_write()
{
Json::Value root; // 表示整个 json 对象
root["platenumber"] = Json::Value("value_string");
root["platetype"] = Json::Value(0);
root["snopshotplaceid"] = Json::Value("12345678");
root["snopshottime"] = Json::Value("20171222");
root["platenumber"] = Json::Value("123456");
root["imgpath"] = Json::Value("D:/TEST.JPG");
root["extFlag"] = Json::Value("EXTFLAG");
root["taskid"] = Json::Value("TASKID");
Json::ValueType type = root.type(); // 获得 root 的类型,此处为 objectValue 类型。
Json::StyledWriter styled_writer;
string strJson = GBKToUTF8(styled_writer.write(root));
const char* chData = strJson.c_str();
cout << strJson << endl;
return strJson;
}
void test_read(string str)
{
string str_json = Utf8ToGbk(str.c_str());
Json::Reader reader;
Json::Value root;
if (reader.parse(str_json, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::cout << "========================[Dispatch]========================" << std::endl;
std::string plate_number = root["platenumber"].asString();
int plate_type = root["platetype"].asInt();
std::string snopshot_place_id = root["snopshotplaceid"].asString();
std::string snopshot_time = root["snopshottime"].asString();
std::string image_path = root["imgpath"].asString();
std::string extFlag = root["extFlag"].asString();
std::string taskid = root["taskid"].asString();
cout << "plate_number :" << plate_number << endl;
cout << "plate_type :" << plate_type << endl;
cout << "snopshot_place_id :" << snopshot_place_id << endl;
cout << "snopshot_time :" << snopshot_time << endl;
cout << "image_path :" << image_path << endl;
cout << "extFlag :" << extFlag << endl;
cout << "taskid :" << taskid << endl;
cout << endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string strJson = test_write();
test_read(strJson);
system("pause");
return 0;
}
运行结果:
完整工程代码:https://gitee.com/betterwgo/jsoncpp_test
测试代码在makefiles目录下的mytest,工程基于VS2013
以上,关于C++的全部内容讲解完毕啦,欢迎大家继续关注!更多关于C++的干货请关注职坐标C++频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号