我的输入字符串是这样的:
std::string temp = "{\"key\":\""+ message + "\"}";
对于Eg:message
可以是这样的:
"Stack \n Overflow"
message
可以是任何东西。它也可以包含转义序列字符。
我希望这是一个有效的JSON,如果我尝试使用下面的代码解析该JSON:
Document document;
document.Parse(temp.c_str());
document.parse
返回null。
我不想在转义序列之前再添加一个\
。我只想了解是否有其他方法可以使用C ++中的快速JSON库来解析此JSON字符串。
答案 0 :(得分:0)
document.Parse
返回null。创建有效的JSON是无可替代的,这意味着确保message
的内容被正确转义,特别是任何"
个字符,控制换行等字符。你必须处理它,不要避免它。
例如
std::string jsonEscape(const std::string &s)
{
std::ostringstream oss;
for(char c : s)
{
switch (c)
{
case '"': oss << "\\\""; break;
case '\\': oss << "\\\\"; break;
case '/': oss << "\\/"; break;
case '\b': oss << "\\b"; break;
case '\f': oss << "\\f"; break;
case '\r': oss << "\\r"; break;
case '\n': oss << "\\n"; break;
case '\t': oss << "\\t"; break;
default:
if ((c >= 0x00) && (c <= 0x1F))
oss << "\\u" << std::hex << std::noshowbase << std::nouppercase << std::setw(4) << std::setfill('0') << (int)c;
else
oss << c;
break;
}
}
return oss.str();
}
std::string temp = "{\"key\": \"" + jsonEscape(message) + "\"}";
或者,您可以简单地使用RapidJSON自己的API来生成有效的JSON字符串,并在之后解析它(这将是多余的,因为您已经有Document
):
Document document(kObjectType);
Value key;
key.SetString(StringRef(message.c_str(), message.length()));
document.AddMember("key", key, document.GetAllocator());
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
document.Accept(writer);
std::string temp = buffer.GetString();