diff --git a/json2table.cc b/json2table.cc index 145d284256e3e50068389d73cda30b5fe6233c53..f63c8196599c9631a5d746085f842f8a025aecc1 100644 --- a/json2table.cc +++ b/json2table.cc @@ -29,9 +29,14 @@ inline string json_to_string(json j) { return program_mode ? j.dump() : "UNKNOWN"; } +void json_decay_single_element_array(json &input) { + while(input.is_array() && input.size() == 1) + input = input[0]; +} void naive_json_access_path(json &input, rlib::string json_path) { for(auto &next : json_path.split('/')) { if(!next.empty()) { + json_decay_single_element_array(input); if(input.is_object()) { // Simplest case. input = input[next]; @@ -40,6 +45,7 @@ void naive_json_access_path(json &input, rlib::string json_path) { // Do this for every element. json result_json_arr = json::array(); for(auto &[_, item] : input.items()) { + json_decay_single_element_array(item); if(item.is_object()) result_json_arr.push_back(item[next]); else @@ -57,7 +63,7 @@ void naive_json_access_path(json &input, rlib::string json_path) { int main(int argc, char **argv) { rlib::opt_parser args(argc, argv); if(args.getBoolArg("-h", "--help")) { - rlib::println("json2table version 1.0.2, maintainer Recolic Keghart <root@recolic.net>"); + rlib::println("json2table version 1.0.3, maintainer Recolic Keghart <root@recolic.net>"); rlib::println("Usage: cat xxx.json | json2table"); rlib::println("Usage: curl https://myapi/getJson | json2table /path/to/subobject"); rlib::println("Set --programming to make the output easier for program to process. "); @@ -75,8 +81,10 @@ int main(int argc, char **argv) { vector<string> headers; vector<vector<string>> rows(1); size_t curr_row_pos = 0; + json_decay_single_element_array(input); if(input.is_array()) { for(auto &[_, item] : input.items()) { + json_decay_single_element_array(item); if(item.is_object()) { // Perfect schema: [{}, {}, ...] for(auto &[key, value] : item.items()) {