C++ 配置生成与解析Json

这是JsonCpp实例下载地址

参考地址1

参考地址2

遇到编译未通过,有个配置属性的 地址

解压后用vs打开makefiles文件夹,里面是jsoncpp和两个test的工程,jsoncpp如下红框中。

  编译jsoncpp项目,然后在程序目录的build文件夹下可以找到编译好的lib文件debug和release下的文件名不同,debug下是json_vc71_libmtd.lib,release下是json_vc71_libmt.lib

  想要在我们的项目中加入jsoncpp库也很简单,只要把jsoncpp的项目的.h文件和.lib文件加入到我们的项目中就可以了,注意引用目录,然后编译看看有没有错误。

-------------------------------------如果出现编译错误,请看这里,否则跳过虚线内容------------------------------------------

1.更改项目属性的运行库

2.Debug模式下编译,应该是没有错误的,如果出现链接错误或者是找不到文件,请查看文件路径设置对不对。需要注意的是Release模式下编译,

有可能会出现fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_writer.asm”: No such file or directory ,

我也出现了这个错误。后来在网上查找原因,好像是jsoncpp的项目编译设置的问题。需要在jsoncpp的项目设置中做如下修改:

----------------------------------------------------------------------------------------------------------------------------

  如下图为json解析过程。

const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";  

    Json::Reader reader;  
    Json::Value root;  
    if (reader.parse(str, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素  
    {  
        std::string upload_id = root["uploadid"].asString();  // 访问节点,upload_id = "UP000000"  
        int code = root["code"].asInt();    // 访问节点,code = 100  
    }  
如上图中代码
void readJson() {
    using namespace std;
    std::string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";

    Json::Reader reader;
    Json::Value value;

    if (reader.parse(strValue, value))
    {   
        std::string out = value["name"].asString();
        std::cout << out << std::endl;
        const Json::Value arrayObj = value["array"];
        for (unsigned int i = 0; i < arrayObj.size(); i++)
        {   
            if (!arrayObj[i].isMember("cpp")) 
                continue;
            out = arrayObj[i]["cpp"].asString();
            std::cout << out;
            if (i != (arrayObj.size() - 1)) 
                std::cout << std::endl;
        }   
    }   
}
json的反序列化

 #include "json.h"

如下为序列化写Json对象

//假设有一个json对象如下:
{
"name": "json″, "array": [ { "cpp": "jsoncpp" }, { "java": "jsoninjava" }, { "php": "support" } ] }
void writeJson() {
    using namespace std;

    Json::Value root;
    Json::Value arrayObj;
    Json::Value item;

    item["cpp"] = "jsoncpp";
    item["java"] = "jsoninjava";
    item["php"] = "support";
    arrayObj.append(item);

    root["name"] = "json";
    root["array"] = arrayObj;

    root.toStyledString();
    std::string out = root.toStyledString();
    std::cout << out << std::endl;
}

 
序列化与反序列化说明

JSONCPP解析示例

a)    解析JSON串格式

{

  "JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207",

  "Send" : {

     "ID" : "B8E09E97-F379-4bb0-814A-389FD3F66631",

     "Items" : [

        {

           "Count" : 2,

           "Code" : "0101",

           "X" : 1,

           "Y" : 2

        },

        {

           "Count" : 2,

           "Code" : "0101",

           "X" : 1,

           "Y" : 2

        }

      ]

   }

}

b)    生成的JSON串

{

  "Ack" : [

      {

        "ActualCount" : 2,

        "Code" : "0101"

     },

      {

        "ActualCount" : 2,

        "Code" : "0101"

      }

   ],

  "JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207"

}
解析、生成JSON代码

需要引入的.h文件

[html] view plaincopy 
#pragma once  
#pragma comment(lib, "json_vc71_libmtd.lib")  
   
#include "json/json.h"  
实现

[cpp] view plaincopy 
void CJSONTestDlg::OnBnClickedButton1()  
{  
    CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1);  
    CString str;   
    pEdit->GetWindowText(str); //str即为a)中定义的JSON串  
    pEdit->FmtLines(true);  
  
    Json::Reader reader;  
    Json::Value root;  
  
    if (reader.parse(WC2UT(str.GetBuffer(0)), root))  // reader将Json字符串解析到root,root将包含Json里所有子元素  
    {  
        std::string JsonID = root["JsonID"].asString();  // JsonID取root元素下的值
        Json::Value rtnRoot;  
        rtnRoot["JsonID"]=JsonID;  
  
        Json::Value ack;  
        Json::Value send = root["Send"];  //send取root下的Send值
        if(!send["Items"].isNull()){  
            Json::Value Items = send["Items"];  //Items取Send下的Items值
            int sendSize = Items.size();  
  
            for(int i=0;i<sendSize;i++){//循环获取到JSON串数组当中的值  
                std::string  Code = Items[i]["Code"].asString();  
                int x = Items[i]["X"].asInt();  
                int y = Items[i]["Y"].asInt();  
                int count = Items[i]["Count"].asInt();  
                  
                //更具读到的JSON串中的值生成所需内容  
                Json::Value newAckItem;  
                newAckItem["Code"]=Code;  
                newAckItem["ActualCount"]=count;  
  
                ack.append(newAckItem);  
            }  
        }  
        rtnRoot["Ack"]=ack;  
        std::string rtnOut = rtnRoot.toStyledString();//生成带格式的JSON串  
#ifdef UNICODE  
        std::wstring stemp = s2ws(rtnOut);   
        LPCWSTR result = stemp.c_str();  
#else  
        LPCWSTR result = rtnOut.c_str();  
#endif  
        MessageBox(result,_T("根据JSON串,生成的对应JSON串信息"));  
        CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
        pEdit->SetWindowText(result);    
    }else{  
        CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);     
        pRtnEdit->SetWindowText(_T("JSON格式错误"));    
    }  
}  

 

 

 

 

 

 

 

 

 

posted @ 2014-07-10 08:41  Jimmy_5  阅读(2190)  评论(0编辑  收藏  举报