Я пытаюсь передать объект JSON, содержащий path, из моего интерфейса (Node) в серверную часть (C++), используя RapidJSON, например так:
#include <iostream>
#include "rapidjson/document.h"
int main() {
const char* json1 = "{\"path\":\"C:\\test.file\"}"; // works
const char* json2 = "{\"path\":\"C:\\fol der\\test.file\"}"; // works
const char* json3 = "{\"path\":\"C:\\fol der\\Test.file\"}"; // ERROR!
const char* json4 = "{\"path\":\"C:\\few dol\\test.file\"}"; // ERROR!
const char* json5 = "{\"path\":\"C:\\folder\\anotherOne\\test.file\"}"; // ERROR!
rapidjson::Document d;
d.Parse(json3); // works using json1 or json2
assert(d.HasMember("path"));
std::string pathString = d["path"].GetString();
return 0;
}
Первые две строки работают. Тем не менее, я не могу найти более длинные пути для работы, и даже использование заглавных букв доставляет мне проблемы (единственная разница между json2 и json3 — это буква «Т»).
Как правильно передавать и анализировать пути (Windows и, возможно, Linux)?
Заранее спасибо!
Редактировать: я только что попробовал библиотеку JSON nlohman и столкнулся с той же проблемой.
Как передать пути в JSON???
@Kartoos: результирующий Document равен нулю (например, d.Parse(json3) ). Так что утверждение впоследствии тоже, конечно, несостоятельно.
Если вы напечатаете свои переменные json, вы получите следующее (С++ интерпретирует escape-символы):
json1: {"path":"C:\test.file"}
json2: {"path":"C:\fol der\test.file"}
json3: {"path":"C:\fol der\Test.file"}
json4: {"path":"C:\few dol\test.file"}
json5: {"path":"C:\folder\anotherOne\test.file"}
Теперь вы можете протестировать эти json в любом инструменте, таком как https://jsonlint.com/, вы получите ошибки. причина ошибки в том, что строки, представленные «путем» в случае json3 и json5, не являются допустимыми строками из-за присутствующих в них недопустимых escape-символов.
Вот список escape-последовательностей для каждой строки: json1 есть \t json2 есть \f и \t json3 есть \f и \T json4 есть \f и \t json5 есть \f и \a и \t
Среди всех этих escape-символов \T и \a недействительны, следовательно, json3 и json5 также недействительны.
Теперь, если вы хотите правильно разобрать его, то одним простым способом может быть использование четырех обратных косых черт \\\\, например:
const char* json3 = "{\"path\":\"C:\\\\fol der\\\\Test.file\"}";
Что будет эквивалентно C:\fol der\Test.file
Список escape-символов см.: stackoverflow.com/questions/983451/…
Спасибо, это помогло. Я также только что узнал о R"()", который требует «только» двойной обратной косой черты.
Gr8 ... Я также подумал, что должен быть какой-то способ интерпретировать строку как необработанную ... Я думаю, вы ее нашли :)
Какую ошибку вы получаете? Является ли путь недействительным путем? или ваши утверждения терпят неудачу?