Files
2024-09-19 01:20:23 +08:00

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;
}