Comments 6
Glaze же умеет тоже самое в режиме с++26 рефлексии?
Окей, получили мы
T out = yjson::ParseJson<jsonType>(input);
Дальше что делать с этим out? Кроме вывода на печать.
Попробуем представить, как этим пользоваться. Предположим что это большой вложенный JSON. Как нам сохранить в своей структурке одно из его полей (структурного типа конечно же)? Какой тип писать в коде?
Здесь T это уже готовый тип. Он генерируется на основе схемы. В данном примере это
struct T
{
std::string_view name;
int age;
};
Этот тип заполняется эквивалентно T{"Alex", 22}. Если в JSON присутствуют вложенные объекты, они так же будут частью итоговой структуры как отдельные поля со своим типом.
Для того, чтобы распарсить только часть JSON, надо использовать механику из библиотеки, которая пока не внедрена в функционал парсинга JSON схемы. А именно, механика аннотации Ignore. Это говорит парсеру, что данное поле не обязательно заполнять.
Таким образом, для извлечения конкретного поля надо распарсить весь объект (получаем тип со вложенными структурыми) и использовать интересующую часть получившейся структуры.
Вопрос был про то, как нам декомпозировать обработку большого JSON. Понятно же, что писать все в одной функции, используя километровые field.item[42].answer.lives.here, не вариант? Даже если мы их вывели из схемы. Вот мы хотим передать во вспомогательную функцию на обработку field.item[i], что нам писать в ее параметрах?
На данный момент мы можем только распарсить целиком JSON и дальше уже работать с итоговой структурой (оттуда уже можно применить стандартные С++ приемы вроде move семантики или референсов для передачи отдельных объектов дальше для обработки).
В будущем можно будет сделать лучше добавив аннотации полей, которые нам интересны (с возвратом, например кортежа или путем заполнения заранее заготовленной структуры, а может вообще можно принять коллбеки для обработки каждой из них). Или же можно будет добавить глобальный обработчик, который один раз будет делать парсинг при первом вызове и дальше предоставлять результат частями всем, кто попросит. В таком случае, как понимаю, мы сможем достичь API о котором Вы говорите.
YOLO‑JSON: Рефлексия + #embed + JSON schema = сверхоптимизированный парсер