Парсинг пути в JSON

Я пытаюсь передать объект 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 22.11.2022 09:31

@Kartoos: результирующий Document равен нулю (например, d.Parse(json3) ). Так что утверждение впоследствии тоже, конечно, несостоятельно.

Markstar 22.11.2022 09:37
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы напечатаете свои переменные 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/…

Kartoos 22.11.2022 10:17

Спасибо, это помогло. Я также только что узнал о R"()", который требует «только» двойной обратной косой черты.

Markstar 22.11.2022 11:45

Gr8 ... Я также подумал, что должен быть какой-то способ интерпретировать строку как необработанную ... Я думаю, вы ее нашли :)

Kartoos 22.11.2022 11:47

Другие вопросы по теме

Похожие вопросы