VC下jsoncpp的使用入门(转)

一、摘要

JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传输格式。

本文并不详细介绍 JSON 本身的细节,旨在讨论如何使用 C++ 语言来处理 JSON。关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org。

二、jsoncpp Windows 下的编译

要使用第三方源码库,第一步少不了的就是编译,将源码文件编译成我们方便使用的动态链接库、静态链接库或者静态导入库[1]。

jsconcpp 进行 JSON 解析的源码文件分布在 include/json、src/lib_json 下。其实 jsoncpp 源码并不多,为了方便产品管理,此处没必要将其编译为动态链接库或者静态导入库,所以我们选择使用静态链接库[2]。

jsoncpp 已经处理的很完善了,所有编译选项都已经配置好,打开makefiles/vs71/jsoncpp.sln 便可以开始编译(默认是使用 VS2003 编译器的,打开时直接按照 VS2005 提示转换即可)。

三、静态链接库的使用

VC中使用静态库的方法

#pragma comment(lib, “xxx.lib”)

但在编译你应用程序时可能出现类似如下的错误

1>libcmtd.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义

1>libcmtd.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义

1>libcmtd.lib(tidtable.obj) : error LNK2005: __encode_pointer 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义

1>libcmtd.lib(tidtable.obj) : error LNK2005: __decode_pointer 已经在 MSVCRTD.lib(MSVCR90D.dll) 中定义

……

解决办法是在编译jsoncpp的lib时,选择动态运行时库

具体含义如下

开关

对应的库

版本

/MD

MSVCPRT.LIB

多线程DLL的Release版本

/MDd

MSVCPRTD.LIB

多线程DLL的Debug版本

/MT

LIBCPMT.LIB

多线程静态链接的Release版本

/MTd

LIBCPMTD.LIB

多线程静态链接的Debug版本

四、jsoncpp 使用详解

jsoncpp 主要包含三种类型的 class:Value、Reader、Writer。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。

Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

1Value

Json::Value 是jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值。

可如下是用 Json::Value 类:

Json::Value json_temp;      // 临时对象,供如下代码使用

json_temp["name"] = Json::Value(“huchao”);

json_temp["age"] = Json::Value(26);

Json::Value root; // 表示整个 json 对象

root["key_string"] = Json::Value(“value_string”); // 新建一个 Key(名为:key_string),赋予字符串值:”value_string”

root["key_number"] = Json::Value(12345);// 新建一个 Key(名为:key_number),赋予数值:12345。

root["key_boolean"] = Json::Value(false);  // 新建一个 Key(名为:key_boolean),赋予bool值:false。

root["key_double"] = Json::Value(12.345); // 新建一个 Key(名为:key_double),赋予 double 值:12.345

root["key_object"] = Json_temp; // 新建一个 Key(名为:key_object),赋予 json::Value 对象值。

root["key_array"].append(“array_string”);// 新建一个 Key(名为:key_array),类型为数组,对第一个元素赋值为字符串:”array_string”

root["key_array"].append(1234);  // 为数组 key_array 赋值,对第二个元素赋值为:1234。

Json::ValueType type = root.type();// 获得 root 的类型,此处为 objectValue 类型。

注:跟C++ 不同,JavaScript 数组可以为任意类型的值,所以 jsoncpp 也可以。

如上几个用法已经可以满足绝大部分 json 应用了,当然 jsoncpp 还有一些其他同能,比如说设置注释、比较 json 大小、交换 json 对象等,都很容易使用,大家自己尝试吧。

2Writer

如上说了 Json::Value 的使用方式,现在到了该查看刚才赋值内容的时候了,查看 json 内容,使用 Writer 类即可。

Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。

顾名思义,用 Json::FastWriter 来处理 json 应该是最快的,下面我们来试试。

Json::FastWriter fast_writer;

std::cout << fast_writer.write(root) << std::endl;

输出结果为:

{“key_array”:["array_string",1234],”key_boolean”:false,”key_double”:12.3450,”key_number”:12345,”key_object”:{“age”:26,”name”:”huchao”},”key_string”:”value_string”}

再次顾名思义,用 Json::StyledWriter 是格式化后的 json,下面我们来看看 Json::StyledWriter 是怎样格式化的。

Json::StyledWriter styled_writer;

std::cout << styled_writer.write(root) << std::endl;

输出结果为:

{

“key_array” : [ "array_string", 1234 ],

“key_boolean” : false,

“key_double” : 12.3450,

“key_number” : 12345,

“key_object” : {

“age” : 26,

“name” : “huchao”

},

“key_string” : “value_string”

}

3Reader

Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的,下面我们来看个简单的例子。

Json::Reader reader;

Json::Value json_object;

const char* json_document = “{/”age/” : 26,/”name/” : /”huchao/”}”;

if (!reader.parse(json_document, json_object))

return 0;

std::cout << json_object["name"] << std::endl;

std::cout << json_object["age"] << std::endl;

输出结果为:

“huchao”

26

可见,上述代码已经解析出了 json 字符串。

来源:http://www.xevc.com/vc%E4%B8%8Bjsoncpp%E7%9A%84%E4%BD%BF%E7%94%A8%E5%85%A5%E9%97%A8/

### 回答1: VC6.0是一种老版本的Visual C++编译环境,相对较老,因此对于JSON解析的支持可能会有一定的限制。 在VC6.0中进行JSON解析,一种常见的方式是使用第三方库,例如json-cpp或者jsoncpp。这些库提供了解析和生成JSON数据的功能,能够方便地处理JSON格式数据。 使用这些库进行JSON解析的步骤大致如下: 1. 首先,需要在工程中链接相应的JSON库文件,这可以通过在工程属性中设置库文件的路径来实现。 2. 接下来,需要在代码中引入相关的头文件,以便可以使用库中提供的JSON解析函数和类。 3. 然后,需要读取JSON数据,可以通过打开相应的JSON文件或者从网络接口获取JSON数据。 4. 使用库提供的JSON解析函数或者类对JSON数据进行解析,将其化为可供程序处理的数据结构。例如,可以将JSON对象解析为C++对象、将JSON数组解析为C++向量等等。 5. 最后,根据具体的需求,可以通过遍历解析后的数据结构来获取JSON中的具体值,或者在程序中进行相应的处理。 需要注意的是,由于VC6.0是比较老的版本,因此第三方库的支持可能会有一些限制或者需要额外的配置。在使用第三方库进行JSON解析时,可能需要手动链接相关的库文件、设置相应的头文件包含路径等。 总之,通过使用第三方库,可以在VC6.0环境下进行JSON解析,从而方便地处理JSON格式的数据。 ### 回答2: VC6.0是一款老旧的集成开发环境,它不原生支持JSON解析。但我们可以借助第三方库来实现JSON解析的功能。 目前比较流行且使用简单的JSON解析库有JsonCpp和RapidJSON。 1. JsonCpp是一个开源的C++ JSON解析库,它不仅能够在VC6.0中使用,还可以在其他版本的VC使用。你可以在其官方网站上下载源代码,然后将其添加到你的项目中。使用JsonCpp,你可以通过调用它提供的API来解析JSON数据,获取其中的键值对。 2. RapidJSON是另一个高性能的C++ JSON解析库,它也可以在VC6.0中使用。你可以在RapidJSON的GitHub仓库中下载它的源代码,并将其添加到你的项目中。使用RapidJSON,你可以通过调用它提供的API来解析JSON数据,并可以非常方便地操作其中的数据。 使用这两个库,你只需要按照它们的文档说明进行配置和调用即可实现JSON解析的功能。 然而,由于VC6.0是一个古老的版本,它的编译器可能不兼容一些新的C++特性和语法。在使用这些库时,你可能需要做一些额外的调整和修改,以确保代码能够正常编译和运行。 综上所述,尽管VC6.0不原生支持JSON解析,但我们可以借助第三方库如JsonCpp和RapidJSON来实现JSON解析的功能。希望我的回答对你有帮助。 ### 回答3: VC6.0是微软推出的一种集成开发环境(IDE),主要用于C/C++编程,不支持对JSON格式数据的直接解析。然而,我们可以借助第三方库来实现JSON解析。 在VC6.0中,我们可以使用第三方库(如JsonCpp、RapidJSON等)来解析JSON数据。这些库提供了便捷的API和功能,可以帮助我们在C++程序中解析和操作JSON格式数据。 首先,我们需要将所选的JSON解析库添加到VC6.0项目中。在项目属性中的"附加包含目录"中添加正确的头文件路径,在"附加库目录"中添加相应的库文件路径。然后,在代码中引入相关的头文件,并使用库提供的API进行JSON解析。 举例来说,如果我们选择使用JsonCpp库,首先需要包含头文件: #include "json/json.h" 然后可以通过以下代码片段解析JSON数据: // 创建Json::Value对象 Json::Value root; // 解析JSON字符串 Json::CharReaderBuilder readerBuilder; Json::CharReader* reader = readerBuilder.newCharReader(); std::string jsonString = (...) // JSON字符串 std::string errors; bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.size(), &root, &errors); // 检查解析结果 if (parsingSuccessful) { // 解析成功,可以对JSON数据进行操作 // 如获取字段值、遍历数组等 } else { // 解析失败,可以处理错误信息 std::cout << "JSON解析失败:" << errors << std::endl; } 通过以上代码,我们可以成功解析JSON数据,并可以根据需要进行进一步的操作。需要注意的是,在使用第三方库时,可能需要根据实际情况调整相关代码,以确保其能够适配VC6.0环境。 总结起来,虽然VC6.0本身不支持对JSON数据的直接解析,但我们可以借助第三方库实现JSON解析操作。在选择和使用第三方库时,需要根据项目需求和VC6.0版本的限制进行适配。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值