MFC JSON解析-开源jsoncpp

前一章说通过百度api获取身份证信息(通过身份证获取性别,地址和出生年月等信息),但是获取到的数据是一个json字符串。
如:
    {"errNum":0,"retMsg":"success","retData":{"address":"\u56db\u5ddd\u7701\u5185\u6c5f\u5e02\u5a01\u8fdc\u53bf","sex":"M","birthday":"1990-12-26"}}

我们需要从中提取出性别,地址和出生年月等信息。这就需要json解析,我用的是开源jsoncpp库。
1. 下载地址:http://sourceforge.net/projects/jsoncpp/ 或者https://github.com/open-source-parsers/jsoncpp ;下载后解压。
2. 有两种使用方法,一种是自己编译成lib静态库,另外一种是直接使用源代码。
自己编译是在jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71目录,VS打开编译即可。
但是我编译后使用发现错误,LNK2038 RuntimeLibrary 不匹配什么的,还有库与微软默认库冲突,后来还是用的源代码。(注意事项:1.那个版本的VS编译的库就需要哪个版本的VS使用,其他版本使用会出错;2.C/C++-代码生成-运行库 这里选项需要注意,编译时什么选择,使用也应该是一样的选择;)
3. 源码有两个目录需要拷贝,一个是jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json,直接拷贝文件到工程下即可,另外一个是 \jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json下文件,此时注意要文件夹json一起拷贝(因为他/#include json/value.h)。可能需要改为:#include “json/value.h”。
4. 代码如下:

#include <afxinet.h> 
#include "json.h"
void CTestJsonDlg::OnBnClickedButton1()
{
    //使用百度api获取数据-----------------------------------------------------------------
    char buf[1000] = { 0 };
    CString StrDate, strValue;
    CInternetSession session;
    CHttpFile* file = NULL; int nRead;
    file = (CHttpFile *)session.OpenURL(_T("http://apistore.baidu.com/microservice/icardinfo?id=xxxxxxxxxxxxxx"));
    if (NULL != file){
        //Do something here with the web request
        //Clean up the file here to avoid a memory leak!!!!!!!      
        while ((nRead = file->Read(buf, sizeof(buf))) > 0){

            StrDate = buf;
        }
        GetDlgItem(IDC_ID_CARD)->SetWindowText(StrDate);
        file->Close();
        delete file;
    }
    session.Close();
    //解析json数据-----------------------------------------------------------------------   
    CString strTemp;
    std::string value;
    Json::Reader reader;
    Json::Value root;
    if (reader.parse(buf, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素  
    {
        int errNum = root["errNum"].asInt();// 访问节点,errNum = 0      
        std::string retMsg = root["retMsg"].asString();  // 访问节点,retMsg = "success"         
        strTemp = retMsg.c_str();
        MessageBox(strTemp);

        Json::Value list = root["retData"]; //包含addresss,sex,birthday    
        if (!list.isNull()){
    //      int count = list.size();            
            Json::Value::Members members(list.getMemberNames());    
    //      std::sort(members.begin(), members.end());
            //解析后面的嵌套json搞了半天,最后才在测试代码中发现解决方案。
            for (auto it = members.begin(); it != members.end();++it)
            {
                const std::string &name = *it;
                std::string str = list[name].asCString();
            //  strTemp = str.c_str();
                strTemp = UTF8ToUnicode(const_cast<char *>(str.c_str()));
                MessageBox(strTemp);
            }
        }
    }
}

5 注意事项:
一个需要注意的地方是编码问题,由于地址是中文,所以需要进行UTF8ToUnicode转码。
还有添加的头文件需要去掉添加预处理头选项,或者#include “StdAfx.h”。
其他Error:
1. json_value.asm”: No such file or directory
2. jsoncpp fatal error link1257
编译库文件时,配置属性-常规-全程序优化 无全程序优化。
C/C++ -输出文件 - 汇编程序输出:无列表。
即可。

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
要在C++中使用jsoncpp库进行JSON解析,你需要按照以下步骤进行设置: 1. 下载jsoncpp库:你可以从jsoncpp的GitHub仓库下载源代码:https://github.com/open-source-parsers/jsoncpp 2. 构建和安装库:根据你的操作系统和编译器,按照jsoncpp的文档说明来构建和安装库。 3. 在你的项目中包含头文件:在你的C++代码中,包含jsoncpp的头文件: ```cpp #include <json/json.h> ``` 4. 解析JSON数据:使用以下代码片段来解析JSON数据: ```cpp // JSON字符串 std::string jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\",\"cars\":[\"Ford\",\"BMW\",\"Fiat\"]}"; // 创建Json::Value对象 Json::Value root; // 解析JSON字符串 Json::CharReaderBuilder reader; std::istringstream iss(jsonString); std::string errors; Json::parseFromStream(reader, iss, &root, &errors); // 获取字段的值 std::string name = root["name"].asString(); int age = root["age"].asInt(); std::string city = root["city"].asString(); const Json::Value cars = root["cars"]; for (unsigned int i = 0; i < cars.size(); ++i) { std::string car = cars[i].asString(); // 处理车辆信息 } ``` 在上面的示例中,我们首先创建一个Json::Value对象来存储解析后的JSON数据。然后,使用Json::CharReaderBuilder和std::istringstream来解析JSON字符串,并将结果存储到Json::Value对象中。之后,我们可以根据需要获取字段的值,将其转换为适当的类型。 请注意,上述示例仅演示了jsoncpp库的基本用法。你可以根据实际需求使用更多的jsoncpp函数和类来处理JSON数据。可以参考jsoncpp的文档和示例代码来了解更多详细用法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值