Быстрый анализатор json возвращает ноль, когда он пытается проанализировать символ ‘\ n’

Моя строка ввода выглядит следующим образом:

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

Например: message может быть так:

"Stack \n Overflow"

message может быть что угодно. Он также может содержать символы escape-последовательности.

Я ожидаю, что это правильный JSON, и если я попытаюсь проанализировать этот JSON, используя следующий код:

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

document.parse возвращается ноль.

Я не хочу добавлять еще один \ перед escape-последовательностями. Я просто хочу понять, есть ли другие способы анализа этой строки JSON с использованием быстрой библиотеки JSON в C ++.

0

Решение

document.Parse возвращает значение NULL, если JSON, который вы передаете ему, недействителен. Ничто не заменит создание действующего 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) + "\"}";

Или вы можете просто использовать собственный API-интерфейс RapidJSON для создания допустимой строки 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();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]