91 lines
2.7 KiB
C++
91 lines
2.7 KiB
C++
#include <iostream>
|
|
#include <fstream>
|
|
|
|
#include "json.h"
|
|
|
|
void print_json_tree(JsonParser::JsonValue value, int init_level) {
|
|
int level = init_level;
|
|
auto print_indent = [&]() {
|
|
for (int i = 0; i < level; i++) {
|
|
std::cout << " ";
|
|
}
|
|
};
|
|
if (value.type == JsonParser::JsonType::OBJECT) {
|
|
std::cout << "{" << std::endl;
|
|
level++;
|
|
size_t count = 0;
|
|
size_t all_count = value.value.object->size();
|
|
for (auto &pair : *value.value.object) {
|
|
print_indent();
|
|
std::cout << "\"" << pair.first << "\": ";
|
|
print_json_tree(pair.second, level);
|
|
if (count < all_count - 1) {
|
|
std::cout << ",";
|
|
}
|
|
std::cout << std::endl;
|
|
count++;
|
|
}
|
|
level--;
|
|
print_indent();
|
|
std::cout << "}";
|
|
} else if (value.type == JsonParser::JsonType::ARRAY) {
|
|
std::cout << "[" << std::endl;
|
|
level++;
|
|
size_t count = 0;
|
|
size_t all_count = value.value.array->size();
|
|
for (auto &element : *value.value.array) {
|
|
print_indent();
|
|
print_json_tree(element, level);
|
|
if (count < all_count - 1) {
|
|
std::cout << ",";
|
|
}
|
|
std::cout << std::endl;
|
|
count++;
|
|
}
|
|
level--;
|
|
print_indent();
|
|
std::cout << "]";
|
|
} else if (value.type == JsonParser::JsonType::STRING) {
|
|
std::string escaped;
|
|
for (char c : *(value.value.string)) {
|
|
switch (c) {
|
|
case '\\':
|
|
case '"':
|
|
case '/':
|
|
escaped += '\\';
|
|
escaped += c;
|
|
break;
|
|
default:
|
|
escaped += c;
|
|
}
|
|
}
|
|
std::cout << "\"" << escaped << "\"";
|
|
} else if (value.type == JsonParser::JsonType::NUMBER) {
|
|
std::cout << value.value.number;
|
|
} else if (value.type == JsonParser::JsonType::INTEGER) {
|
|
std::cout << value.value.integer;
|
|
} else if (value.type == JsonParser::JsonType::BOOLEAN) {
|
|
std::cout << (value.value.boolean ? "true" : "false");
|
|
} else if (value.type == JsonParser::JsonType::NULL_VALUE) {
|
|
std::cout << "null";
|
|
} else {
|
|
throw std::runtime_error("Unexpected JSON type");
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
std::string input;
|
|
{
|
|
std::ifstream file("input.txt");
|
|
std::string line;
|
|
while (std::getline(file, line)) {
|
|
input += line;
|
|
}
|
|
}
|
|
|
|
JsonParser::JsonValue value = JsonParser::parse(input.c_str());
|
|
|
|
print_json_tree(value, 0);
|
|
std::cout << std::endl;
|
|
}
|