2

我的输入字符串是这样的:

std::string temp = "{\"key\":\""+ message + "\"}";

例如:message可以是这样的:

"Stack \n Overflow"

message可以是任何东西。它也可以包含转义序列字符。

我希望这是一个有效的 JSON,如果我尝试使用以下代码解析该 JSON:

Document document; 
document.Parse(temp.c_str());

document.parse正在返回 null。

我不想\在转义序列之前再添加一个。我只是想了解是否有任何其他方法可以使用 C++ 中的快速 JSON 库来解析这个 JSON 字符串。

4

1 回答 1

2

document.Parse当您传递给它的 JSON 无效时返回 null。创建有效 JSON 是无可替代的,这意味着确保message正确转义 的内容,尤其是任何"字符、控制字符(如换行符等)。您必须处理它,而不是避免它。

例如

#include <string>
#include <sstream>
#include <iomanip>

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();
于 2018-03-23T09:03:42.723 回答