将 json++ 实现转换为使用 rapidJSON:处理字符串和 wstring 的混合
converting json++ implementation to use rapidJSON: handling mixture of string and wstring
我正在将一些最初使用 json++ 库的代码转换为现在使用 rapidJSON。该代码使用 json 文件序列化和反序列化各种对象。在 json++ 中,它看起来像这样:
序列化:
string normal = "normal";
wstring wide = L"wide";
JSON::Object json;
json["normal"] = normal;
json["wide"] = wide;
反序列化:
string normalCopy = json["normal"].as_string();
wstring wideCopy = json["wide"].as_wstring();
我还没有找到使用 rapidJSON 序列化和反序列化混合字符串的简单方法。
这里有两个例子:
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <iostream>
#include <sstream>
using namespace std;
using namespace rapidjson;
int main()
{
string normalstr = "This is a normal string";
wstring widestr = L"This is a wide string";
Document doc;
auto& alloc = doc.GetAllocator();
Value val(kObjectType);
val.AddMember("normal", normalstr, alloc);
val.AddMember("wide", widestr, alloc); // <-- cannot convert
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
val.Accept(writer);
ostringstream jsonOutput;
jsonOutput << buffer.GetString();
cout << jsonOutput.str() << endl;
}
和
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <iostream>
#include <sstream>
using namespace std;
using namespace rapidjson;
int main()
{
string normalstr = "This is a normal string";
wstring widestr = L"This is a wide string";
Document doc;
auto& alloc = doc.GetAllocator();
GenericValue<UTF16<> > val(kObjectType);
val.AddMember(L"normal", normalstr, alloc); // <-- cannot convert
val.AddMember(L"wide", widestr, alloc);
GenericStringBuffer<UTF16<> > buffer;
Writer<GenericStringBuffer<UTF16<> >, UTF16<>> writer(buffer);
val.Accept(writer);
ostringstream jsonOutput;
jsonOutput << buffer.GetString();
cout << jsonOutput.str() << endl;
}
根据我的理解,在处理对象级粒度时,RapidJSON 被设置为专门使用 std::string (UTF-8) 或 std::wstring (UTF-16)。
当我在要序列化的对象中有两种类型时,我是否需要从 wstring 转换为字符串,或者 API 中是否有我不知道的可用内容?
我认为你需要在这里使用转换,我已经查看了 RapidJSON 的文档和 src,并确认我们不能将 GenericValue
与 Value
混合使用。
我们可以用wstring_convert
,参考这个answer
或 boost.
我正在将一些最初使用 json++ 库的代码转换为现在使用 rapidJSON。该代码使用 json 文件序列化和反序列化各种对象。在 json++ 中,它看起来像这样:
序列化:
string normal = "normal";
wstring wide = L"wide";
JSON::Object json;
json["normal"] = normal;
json["wide"] = wide;
反序列化:
string normalCopy = json["normal"].as_string();
wstring wideCopy = json["wide"].as_wstring();
我还没有找到使用 rapidJSON 序列化和反序列化混合字符串的简单方法。
这里有两个例子:
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <iostream>
#include <sstream>
using namespace std;
using namespace rapidjson;
int main()
{
string normalstr = "This is a normal string";
wstring widestr = L"This is a wide string";
Document doc;
auto& alloc = doc.GetAllocator();
Value val(kObjectType);
val.AddMember("normal", normalstr, alloc);
val.AddMember("wide", widestr, alloc); // <-- cannot convert
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
val.Accept(writer);
ostringstream jsonOutput;
jsonOutput << buffer.GetString();
cout << jsonOutput.str() << endl;
}
和
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <iostream>
#include <sstream>
using namespace std;
using namespace rapidjson;
int main()
{
string normalstr = "This is a normal string";
wstring widestr = L"This is a wide string";
Document doc;
auto& alloc = doc.GetAllocator();
GenericValue<UTF16<> > val(kObjectType);
val.AddMember(L"normal", normalstr, alloc); // <-- cannot convert
val.AddMember(L"wide", widestr, alloc);
GenericStringBuffer<UTF16<> > buffer;
Writer<GenericStringBuffer<UTF16<> >, UTF16<>> writer(buffer);
val.Accept(writer);
ostringstream jsonOutput;
jsonOutput << buffer.GetString();
cout << jsonOutput.str() << endl;
}
根据我的理解,在处理对象级粒度时,RapidJSON 被设置为专门使用 std::string (UTF-8) 或 std::wstring (UTF-16)。
当我在要序列化的对象中有两种类型时,我是否需要从 wstring 转换为字符串,或者 API 中是否有我不知道的可用内容?
我认为你需要在这里使用转换,我已经查看了 RapidJSON 的文档和 src,并确认我们不能将 GenericValue
与 Value
混合使用。
我们可以用wstring_convert
,参考这个answer
或 boost.