C++语言之C++ json解析
安安 2017-10-19 来源 :网络 阅读 1058 评论 0

摘要:本篇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++频道!

本文由 @安安 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程