Jsoncpp使用总结

4 篇文章 0 订阅

干it也有快3年了,一直在小公司,什么都要干,接触过很多技术,花时间学会了,将任务完成了,基本上也就放下了。从来没有认真写博客总结一下。现在痛下决心,决定好好将自己用到过的技术好好总结一些。

此篇博客是学习完json写的,json是一种标记语言,功能和xml相似,但是要比xml轻量级。从自己使用的经验来看,json将会慢慢被使用的越来越广泛。

很多语言都有现成的解析json的开源库,其中C++用来解析json的是jsoncpp。

下载网址:http://sourceforge.net/projects/jsoncpp/

 

使用方法有两个,可以将之编译成.Lib的静态库,或者直接将源文件加入到工程。我用的是编译成静态库,尽量减少主工程中的可见代码量。

 

方法一:使用Jsoncpp生成的lib文件
      
解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译,默认生成静态链接库。 在工程中引用,只需要包含include/json下的头文件及生成的.lib文件即可。
      如何包含lib文件:在.cpp文件中#pragma comment(lib."json_vc71_libmt.lib"),在工程属性中Linker下Input中AdditionalDependencies写入lib文件名字(Release下为json_vc71_libmt.lib,Debug为json_vc71_libmtd.lib)

(建议最好在自己的软件开发平台下编译,我是在vc6.0下编译的,因为在2010下编译好后在vc6.0里不能用。自己建立一个C++静态库项目,将头文件和源文件里的非.cpp的文件加入到工程头文件,将.cpp文件加入到源文件中。可能会遇到几个编译错误,自己根据实际情况解决掉就好了。)


注意:Jsoncpp的lib工程编译选项要和VS工程中的编译选项保持一致。如lib文件工程编译选项为MT(或MTd),VS工程中也要选择MT(或MTd),否则会出现编译错误问题,debug和release下生成的lib文件名字不同,注意不要看错了,当成一个文件来使用(我就犯了这个错误)。

方法二:使用Jsoncpp包中的.cpp.h文件
      解压上面下载的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷贝到工程目录下,将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目录里的文件包含到VS工程中,在VS工程的属性C/C++下General中AdditionalInclude Directories包含头文件目录.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json头文件即可,如:#include"json/json.h"。将json_reader.cpp、json_value.cpp和json_writer.cpp三个文件的Precompiled Header属性设置为Not Using Precompiled Headers,否则编译会出现错误。

具体使用

解析代码:

Json文本:

[{“log1”,”001”},{“log2”,”002”},{“log3”,”003”}]

 

         char     szJsonstr[1024];

         CString  cstrJsonStr;

        

         GetDlgItemText(IDC_EDIT1,szJsonstr,1024);

         cstrJsonStr= szJsonstr;

        

         std::stringstrJString;

        

         strJString= cstrJsonStr.GetBuffer(cstrJsonStr.GetLength());

        

         Json::Reader  JReader;

         Json::Value        JValue; 

        

         //if(JReader.parse(strJString,JValue))

         if(JReader.parse(szJsonstr,JValue))

         {

                   std::stringstrOut1;

                   //=JValue["log1"].asString();  

                   //std::stringstrOut2 = JValue["log2"].asString();

                   for(int i=0; i<JValue.size(); i++)

                   {

                            strOut1= JValue[i]["log1"].asString();

                            intiii = 4;

                   }

         }

 

Json字符串拼接:

         Json::Valueroot;

         Json::ValuearrayObj;

         Json::Valueitem;

        

         item["cpp"]="jsoncpp";

         item["java"]="jasomjava";

         item["php"]="support";

         arrayObj.append(item);

 

         Json::Valueitem2;

         item2["cpp"]="jsoncpp";

         item2["java"]="jasomjava";

         item2["php"]="support";

         arrayObj.append(item2);

 

         root["namea"]= "json";

         root["arraya"]= arrayObj;

        

         std::stringitemstr = item.toStyledString();

         std::stringlogstr = arrayObj.toStyledString();

         std::stringlogAppendstr = root.toStyledString();

 

 

         CStringcstrResult = itemstr.c_str();

         cstrResult+=  logstr.c_str();

         cstrResult+=  logAppendstr.c_str();

 

         //GetDlgItem(IDC_EDIT1).

         SetDlgItemText(IDC_EDIT1,cstrResult);

拼接结果:

Item拼接出来是这样的:

{

  "cpp" : "jsoncpp",

  "java" : "jasomjava",

  "php" : "support"

}

 

arryObj拼接出来是这样的:

[

   {

     "cpp" : "jsoncpp",

     "java" : "jasomjava",

     "php" : "support"

   },

   {

     "cpp" : "jsoncpp",

     "java" : "jasomjava",

     "php" : "support"

   }

]

 

 

Root拼接出来是这样的:

{

  "arraya" : [

     {

        "cpp" : "jsoncpp",

        "java" : "jasomjava",

        "php" : "support"

     },

     {

        "cpp" : "jsoncpp",

        "java" : "jasomjava",

        "php" : "support"

     }

   ],

  "namea" : "json"

}       

 

最后再说几句鼓励自己的话,做了C++三年,自己仔细想真的没有沉淀下来多少,对于代码项目组织的乱七八糟。原因就是自己没有认真总结,没有对学到的知识做到温故知新,既然要做这一行,就好好做,不能再得过且过,混日子了。对自己负责,如果连一个优秀的程序员、优秀的员工都做不到,创业就是扯淡。以后会根据实际情况,指定每周写一篇博客的计划,哪怕是一个小小的知识点。真正的努力,才会有好结果。加油!!

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要解析JSON文件,首先需要安装jsoncpp库,可以通过以下命令安装: ``` sudo apt-get install libjsoncpp-dev ``` 安装完毕后,就可以使用jsoncpp库来解析JSON文件了。下面是一个简单的示例程序: ```cpp #include <iostream> #include <fstream> #include <jsoncpp/json/json.h> using namespace std; int main() { ifstream ifs("example.json"); Json::Reader reader; Json::Value root; if (!reader.parse(ifs, root)) { cout << "Failed to parse JSON" << endl; return 1; } string name = root["name"].asString(); int age = root["age"].asInt(); cout << "Name: " << name << endl; cout << "Age: " << age << endl; return 0; } ``` 在这个示例程序中,首先通过ifstream读取example.json文件,然后使用Json::Reader来解析JSON文件,解析结果存放在Json::Value对象root中。可以通过root对象来访问JSON中的数据。 在这个示例程序中,我们访问了JSON中的"name"和"age"字段,并将它们打印出来。 需要注意的是,以上示例程序中的JSON文件格式如下: ```json { "name": "John", "age": 30 } ``` 如果JSON文件的格式不正确,解析过程中可能会出现错误。因此,在实际应用中,需要根据实际情况进行错误处理。 ### 回答2: JSONCpp是一个C++的库,用于解析和生成JSON格式的数据。它提供了一组简单的API来读取和修改JSON数据。 使用JSONCpp解析JSON文件的过程包括以下几个步骤: 1. 引入JSONCpp库:在编程环境中,需要将JSONCpp库文件引入到项目中。可以从JSONCpp的官方网站上下载并配置库文件。 2. 打开JSON文件:使用JSONCpp库中的`Json::CharReader`来打开JSON文件,将其读取为一个字符串。 3. 解析JSON文件:使用JSONCpp库中的`Json::Value`来解析JSON字符串。可以使用`Json::Reader`的`parse()`方法来将JSON字符串转换为`Json::Value`对象。 4. 提取JSON数据:使用`Json::Value`对象的成员访问运算符`[]`来获取JSON数据。可以使用`isMember()`方法判断指定的成员是否存在,使用`asString()`、`asInt()`等方法获取指定成员的值。 5. 遍历JSON数据:如果JSON数据是一个数组类型,可以使用`size()`方法获取数组的长度,使用`operator[]`来访问数组中的元素。 6. 修改JSON数据:使用`Json::Value`对象的成员访问运算符`[]`来修改JSON数据。可以使用`append()`方法向数组类型的JSON数据中添加元素。 7. 保存JSON文件:使用JSONCpp库中的`Json::StyledWriter`对象将`Json::Value`对象转换为字符串,并将其写入文件中。 总结起来,使用JSONCpp解析JSON文件的过程可以归纳为:引入库文件、打开JSON文件、解析JSON文件、提取和操作JSON数据、保存JSON文件。这样就可以实现对JSON文件的读取和解析操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值