черновик · текст собрал Claude по репозиториям и заметкам, перепишу сам
Небольшая JSON-библиотека, написанная в октябре 2024 года для транспортного справочника — финального проекта курса C++.
Она читает JSON из потока и выводит его обратно. Узел документа хранится в std::variant: null, логическое значение, целое или дробное число, строка, массив или словарь. Разбор рекурсивный: функция смотрит на первый символ и решает, что читать дальше. При ошибке в данных выбрасывается ParsingError, при запросе значения не того типа — logic_error.
В отдельный репозиторий она переехала, чтобы на следующем шаге курса сделать к ней билдер — сборку JSON цепочкой вызовов. Файлы json_builder в репозитории есть, но пустые: дальше заготовки я не дошёл. Тесты в main.cpp — из курса.
Фрагмент
Разбор массива:
Node LoadArray(std::istream& input) {
Array result;
char c;
while (input >> c) {
if (c == ']') { // Пустой массив
return Node{result};
} else {
input.putback(c);
result.push_back(LoadNode(input)); // Загрузка элемента массива
}
// Ожидаем запятую или закрывающую скобку
input >> c;
if (c == ']') {
return Node{result};
} else if (c != ',') {
throw ParsingError("Expected ',' or ']' in array");
}
}
throw ParsingError("Expected ']' at the end of array");
}