JsonCpp 是一个比较著名的JSON (JavaScript Object Notation) 开发库,官方网站:http://jsoncpp.sourceforge.net/ ,JsonCpp 的最新版本 0.5.0,官方下载地址:http://sourceforge.net/projects/jsoncpp/files/ 。
官方版本只提供了 Visual C++ 的编译和使用方法,C++ Builder 编译会报语法错误,经过测试,发现做如下改动,可以在 C++ Builder 里面编译通过:
① include\json\value.h 第 886 行开始位置的 ValueIteratorBase 类的几个构造函数移动到这个类的后面,移动之后的位置在第 938 行开始的位置,只是把位置移动到这里,没有修改代码内容。构造函数写在前面就编译不通过,写在后面就能编译通过,至于为什么,还没研究明白,因为任何地方的语法都根本就没有错误。
② src\lib_json\json_reader.cpp 第 9 行:添加一行 #include <stdio.h> 。也许是 VC 会在项目里面默认就包含这个头文件,BCB 需要在代码里面添加包含 stdio.h 才能调用里面的函数。
使用方法:
第一种方法:先生成 .lib 库文件,应用程序链接这个库文件。
编译、生成 .lib 库文件的方法:创建一个生成静态库的项目,只需要把 jsoncpp-src-0.5.0\src\lib_json 文件夹里面的 3 个 .cpp 文件:
json_reader.cpp
json_value.cpp
json_writer.cpp
加入进来,编译,生成的 .lib 文件就可以使用了。
第二种方法:直接把 jsoncpp-src-0.5.0\src\lib_json 文件夹里面的 3 个 .cpp 文件:
json_reader.cpp
json_value.cpp
json_writer.cpp
加入应用程序项目文件。
下面主要是介绍 UNICODE 支持。
C++ Builder 2009 之后支持 UNICODE,之前版本,比如 BCB 6.0 不支持 UNICODE。
C++ Builder 2009 之后的版本,可以用 UTF8String 来让 JsonCpp 开发库支持 UNICODE。
早期版本的 BCB 不支持 UNICODE,只能用 AnsiString 代替后面文章的 UTF8String,当然,程序也就不支持 UNICODE 了,所有的处理都是 ANSI 编码了。
以下关于 UNICODE 的支持,适用于 C++ Builder 2009 之后的版本。
UNICODE 字符串转换的规律:std::string <= 用.c_str() => UTF8String <= 直接赋值 => UnicodeString 或 L"字符串"。 - http://www.cppfans.com/
UTF8String 可以和 UnicodeString 之间相互赋值,因为他们都是 UNICODE,只是编码方式不同,一个是 UTF-8,另一个是 UTF-16。
UTF8String 可以和 std::string 之间,用 .c_str() 转换为另一个,而 UnicodeString 和 std::string 之间转换,必须中间经过 UTF8String。
例如:
UTF8String u8 = L"UNICODE字符串"; // 引号前面加 L 表示使用 UNICODE |
掌握了这个规律,就可以让 JsonCpp 支持 UNICODE。
Json::Value root; |
解析和读取数据:
void __fastcall TFormTestJson::ButtonGetValueClick(TObject *Sender) Memo2->Lines->Clear(); UTF8String key = L"整数值"; int n = root["arrval"].size(); |
生成 Json 文件:
void __fastcall TFormTestJson::ButtonSaveFileClick(TObject *Sender) key = L"name"; key = L"desc"; key = L"字符串值"; UTF8String txt = root.toStyledString().c_str(); UnicodeString fname = ExtractFilePath(Application->ExeName)+L"Test.txt"; |