beyard

常用链接

统计

最新评论

[转]JsonCPP编译方法

1. 下载 http://sourceforge.net/projects/jsoncpp/  项目为\jsoncpp-src-0.5.0

Linux 编译见:
http://www.cnblogs.com/xudong-bupt/p/3696329.html


Windows Visual studio 下见:

C++要使用JSON来解析数据,一般采用jsoncpp.

下载jsoncpp后,按ReadMe文档的说法是要先安装的,但是安装比较麻烦。然而事实上,我们并不需要安装,就可以直接使用。

方法一:直接拷贝源文件。这个方法比较简单,但不推荐,因为不便于项目管理。

  1. VS2008里新建一个空的控制台程序(用作测试jsoncpp是否可用),名为: TestJSON
  2. 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz
  3. 将 jsoncpp-src-0.5.0\include 目录下的json文件夹拷贝至 TestJSON 工程目录下
  4. 将 jsoncpp-src-0.5.0\src\lib_json 目录下的所有.h, .cpp 文件以及json_valueiterator,  json_internalarray,  json_internalmap全部拷贝至 TestJSON 工程目录下
  5. 在VS2008里引入工程目录下刚刚从 jsoncpp-src-0.5.0 导入的文件,如图1
  6. 在VS2008里新建main.cpp来测试jsoncpp是否可用。代码见文章末尾main.cpp
  7. 在调试过程中会遇到一些错误,相应改之即可:
  8. json_reader.cpp 中加入#include "stdafx.h",将#include<json/reader.h>改为#include“json/reader.h”,#include<json/value.h>改为#include "json/value.h";
  9. json_value.cpp中加入#include "stdafx.h",将#include <json/value.h>改为#include "json/value.h", #include <json/writer.h>改为 #include "json/writer.h";
  10. json_writer.cpp中加入#include "stdafx.h",将#include <json/writer.h>改为#include "json/writer.h"。

方法二:使用静态链接库

  1. VS2008里新建一个空的控制台程序(用作测试jsoncpp是否可用),名为: TestJSON
  2. 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz
  3. 利用VS2008打开jsoncpp-src-0.5.0\makefiles\vs71目录下的jsoncpp.sln,会出现三个Project:jsontest, lib_json, test_lib_json
  4. 在lib_json上 右击-->Properties-->Configuration Properties-->C/C++-->Code Generation,注意右侧的Runtime Library的内容,如图2,看完箭头所指的东西就可以点确定,关掉属性页。
  5. 编译lib_json,显示编译成功后,在jsoncpp-src-0.5.0\build\vs71\debug\lib_json目录下会生成一个json_vc71_libmtd.lib,将这个lib拷贝至TestJSON工程目录下。
  6. 将jsoncpp-src-0.5.0\include\json目录下的所有.h文件拷贝至TestJSON工程目录下,并在工程Header Files引入.
  7. 将方法一里的main.cpp添加到工程中,并在工程名上 右击-->Properties-->Configuration Properties-->C/C++-->Code Generation, 将Runtime Library改成图2箭头所示内容。
  8. 在工程名上 右击-->Properties-->Configuration Properties-->Linker-->Input, 在Additional Dependencies里填写json_vc71_libmtd.lib,然后确定,编译就行了。

图1:

图2:



---

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
UnicodeString u16 = L"UNICODE字符串"; // 引号前面加 L 表示使用 UNICODE
std::string ss; // 不要直接给 std::string 赋值,因为这个类型不能直接支持 UNICODE,需要用 UTF-8 

u8=u16; // UTF-8 和 UNICODE (UTF-16) 之间可以直接赋值
ss=u8.c_str(); // 用 UTF8String 的 .c_str() 转成 std::string
// http://www.cppfans.com/
u8=ss.c_str(); // 用 std::string 的 .c_str() 转成 UTF8String
u16=u8; // UNICODE (UTF-16) 和 UTF-8 之间可以直接赋值

掌握了这个规律,就可以让 JsonCpp 支持 UNICODE。

Json::Value root;

root["name"] = "Mr. Chen"; // 英文的 UTF-8 编码和 ANSI 编码相同,这样写没有问题
root[UTF8String(L"姓名").c_str()] = UTF8String(L"陈先生").c_str(); // 汉字必须说明 UTF-8

UTF8String name = root["name"].asCString(); // asCString() 可直接转成 UTF8String
UTF8String 姓名 = root[UTF8String(L"姓名").c_str()].asCString();
// http://www.cppfans.com/
Memo2->Lines->Add(L"name: " + name); // UTF-8 也是 UNICODE,这样写没问题
Memo2->Lines->Add(L"姓名: " + 姓名); // UTF-8 也是 UNICODE,这样写没问题

解析和读取数据:

void __fastcall TFormTestJson::ButtonGetValueClick(TObject *Sender)
{
   UTF8String txt = Memo1->Text; // 使用 UTF8String 来支持 UNICODE 
   Json::Reader reader;
   Json::Value root;
   if(!reader.parse(txt.c_str(),root)) // 需要用.c_str()转换 - http://www.cppfans.com/
   {
       Memo2->Lines->Add(L"结构错误");
       return;
   }

  Memo2->Lines->Clear();
  UTF8String s = root["strval"].asCString(); // asCString() 可直接给 UTF8String 赋值
  Memo2->Lines->Add(L"strval="+s); // UNICODE / UTF8 是支持世界各国语言的

  UTF8String key = L"整数值";
  s = root[key.c_str()].asCString();
  Memo2->Lines->Add(L"整数值="+s);

  int n = root["arrval"].size();
  for(int i=0; i<n; i++)
  {
     s = root["arrval"][i].asCString();
     Memo2->Lines->Add(L"arrval的第"+String(i)+L"个数是"+s);
  }
}

生成 Json 文件:

void __fastcall TFormTestJson::ButtonSaveFileClick(TObject *Sender)
{
  Json::Value root;
  UTF8String key, val; // 使用 UTF8String 来支持 UNICODE

  key = L"name";
  val = L"JSON测试程序, 支持UNICODE哦";
  root[key.c_str()] = val.c_str();

  key = L"desc";
  val = L"Copyright © Victor Chen, http://www.cppfans.com/";
  root[key.c_str()] = val.c_str();

  key = L"字符串值";
  val = L"中文한국어Tiếng Việt"; // UNICODE / UTF-8 支持世界各国语言混合文本
  root[key.c_str()] = val.c_str();

  UTF8String txt = root.toStyledString().c_str();
  Memo2->Text = txt;

  UnicodeString fname = ExtractFilePath(Application->ExeName)+L"Test.txt";
  int hFile = FileCreate(fname);
  if(hFile>=0)
  {
    if(RadioButtonUNICODE->Checked)
    {
      Memo2->Lines->Add(L"生成UNICODE文件");
      UnicodeString us = txt;
      FileWrite(hFile,"\xFF\xFE",2); // UNICODE
      FileWrite(hFile,us.c_str(),us.Length()*sizeof(wchar_t));
    }
    else
    {
      Memo2->Lines->Add(L"生成UTF8文件");
      FileWrite(hFile,"\xEF\xBB\xBF",3); // UTF8
      FileWrite(hFile,txt.c_str(),txt.Length());
    }
    FileClose(hFile);
    Memo2->Lines->Add(L"已经保存到UTF8文件: "+fname);
  }
}

其他内容可以下载演示程序查看。

下载的文件内容:

① 修改之后的 JsonCpp 开发库 jsoncpp-src-0.5.0 ,在开发库 jsoncpp-src-0.5.0 文件夹里面新增加了一个 makefiles\bcb2010 文件夹,里面是 C++ Builder 2010 静态库项目文件,用 C++ Builder 2010 打开编译,可以生成 lib\bcb\jsoncpp.lib 文件。其他版本的 C++ Builder 可以按照前面的使用方法自己创建一个静态库。

② C++ Builder 2010 演示程序,在 testJSON 文件夹里面,是一个完整的 C++ Builder 2010 项目,包含解析、生成、读文件、写文件等。

演示程序支持 UNICODE / UTF8,可按需要生成 UTF8 或 UNICODE (UTF16) 文件,读取文件可自动识别 UTF8 / UNICODE (UTF16) / ANSI 文件,完美支持世界各国语言混合文字内容,当然也包括中文。
 





posted on 2015-01-08 22:19 阅读(1057) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理