使用rapidjson和ATL CString

时间:2014-12-06 22:21:08

标签: c++ visual-studio-2013 mfc atl rapidjson

我正在尝试将rapidjson库与Microsoft ATL CString类型一起使用,如下例所示。

#include "stdafx.h"
#include "rapidjson\document.h"

using namespace rapidjson;
typedef GenericDocument<UTF16<> > WDocument;

int main()
{
    WDocument document;
    CString hello = _T("Hello");
    document.SetObject();
    document.AddMember(_T("Hello"), hello, document.GetAllocator());
    return 0;
}

这会因编译错误而失败

  

'rapidjson :: GenericValue :: GenericValue(rapidjson :: GenericValue&amp;&amp;)':无法将参数1从'CString'转换为'rapidjson :: Type'fastjson document.h 1020

这意味着需要在CString和rapidjson需要的格式之间进行转换。我知道rapidjson内部使用wchar_t作为其函数的UTF16版本的编码,但是我不知道如何将一个CString转换为wchar_t(或wchar_t数组),以使rapidjson能够使用该字符串作为它使用_T宏定义的字符串。

我已经查看了在字符串类型here之间转换的msdn资源,但是这只提供了一种方法来返回指向wchar_t数组的第一个成员的指针,而rapidjson则无法使用它。

1 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是使用其中一个构造函数rapidjson为其GenericValue类提供,即指向字符编码类型和字符长度的指针的构造函数。

GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_(), flags_() { SetStringRaw(StringRef(s, length)); }

此构造函数可以获取指向rapidjson接受的任何字符类型的指针以及长度,然后将其读取为值。对于ATL :: CString类,可以使用CString对象上可用的.GetString().GetLength()方法来完成。返回可在DOM树中使用的Value的函数如下所示:

typedef GenericValue<UTF16<> > WValue;

WValue CStringToRapidjsonValue(CString in)
{
    WValue out(in.GetString(), in.GetLength());
    return out;
}