Imperial Analysis
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
JsonTools.cc
Go to the documentation of this file.
2 #include <iostream>
3 #include <fstream>
4 #include <string>
5 #include <ctype.h>
6 #include "boost/algorithm/string.hpp"
7 #include "boost/lexical_cast.hpp"
8 
9 namespace ic {
10 Json::Value ExtractJsonFromFile(std::string const& file) {
11  Json::Value js;
12  Json::Reader json_reader;
13  std::fstream input;
14  input.open(file);
15  if (!input.is_open()) {
16  throw std::runtime_error("[ExtractJsonFromFile] Unable to open file " + file);
17  }
18  json_reader.parse(input, js);
19  return js;
20 }
21 
22 Json::Value ExtractJsonFromString(std::string const& str) {
23  Json::Value js;
24  Json::Reader reader(Json::Features::all());
25  reader.parse(str, js);
26  return js;
27 }
28 
29 Json::Value ExtractJsonFromFlatString(std::string const&str){
30  std::vector<std::string> split_str;
31  std::vector<std::string> split_lastarg;
32  boost::split(split_str,str,boost::is_any_of(":"));
33  boost::split(split_lastarg,split_str.at(split_str.size()-1),boost::is_any_of("^"));
34  std::string jsonstr = "{\"";
35  if(split_lastarg.size()==1){
36  for(unsigned i = 0; i<split_str.size()-1;i++){
37  if(i==split_str.size()-2){
38  jsonstr = jsonstr+split_str.at(i)+"\":";
39  } else jsonstr = jsonstr+split_str.at(i)+"\":{\"";
40  }
41  bool is_num = true;
42  try{
43  boost::lexical_cast<double>(split_str.at(split_str.size()-1));
44  }
45  catch(boost::bad_lexical_cast& e){
46  is_num = false;
47  }
48  bool is_bool=false;
49  if(strcmp((split_str.at(split_str.size()-1)).c_str(),"false")==0||strcmp((split_str.at(split_str.size()-1)).c_str(),"true")==0){
50  is_bool = true;
51  }
52  if(is_bool || is_num){
53  jsonstr = jsonstr+split_str.at(split_str.size()-1)+std::string(split_str.size()-1,'}');
54  } else {
55  if(strcmp(split_str.at(split_str.size()-1).c_str(),"")==0){
56  jsonstr = jsonstr+"[]"+std::string(split_str.size()-1,'}');
57  } else {
58  jsonstr = jsonstr+"\""+split_str.at(split_str.size()-1)+"\""+std::string(split_str.size()-1,'}');
59  }
60  }
61 
62 
63  } else {
64  for(unsigned i = 0; i<split_str.size()-1;i++){
65  if(i==split_str.size()-2){
66  jsonstr = jsonstr+split_str.at(i)+"\":[";
67  } else jsonstr = jsonstr+split_str.at(i)+"\":{\"";
68  }
69  bool is_num = true;
70  bool are_all_num = true;
71  for(unsigned k = 0; k<split_lastarg.size(); k++){
72  if(strcmp((split_lastarg.at(k)).c_str(),"")!=0){
73  try{
74  boost::lexical_cast<double>(split_lastarg.at(k));
75  }
76  catch(boost::bad_lexical_cast& e){
77  is_num = false;
78  }
79  are_all_num = are_all_num&&is_num;
80  }
81  }
82  bool is_bool=false;
83  bool are_all_bool = true;
84  for( unsigned k = 0; k<split_lastarg.size();k++){
85  if(strcmp((split_lastarg.at(k)).c_str(),"")!=0){
86  if(strcmp((split_lastarg.at(k)).c_str(),"false")==0||strcmp((split_lastarg.at(k)).c_str(),"true")==0){
87  is_bool = true;
88  }
89  are_all_bool = are_all_bool&&is_bool;
90  }
91  }
92  if(are_all_bool || are_all_num){
93  for(unsigned k = 0; k<split_lastarg.size()-1;k++){
94  if(strcmp("",split_lastarg.at(k).c_str())!=0){
95  jsonstr = jsonstr+split_lastarg.at(k)+",";
96  }
97  }
98  jsonstr=jsonstr+split_lastarg.at(split_lastarg.size()-1)+"]"+std::string(split_str.size()-1,'}');
99  } else {
100  for(unsigned k = 0; k<split_lastarg.size()-1;k++){
101  if(strcmp("",split_lastarg.at(k).c_str())!=0){
102  jsonstr = jsonstr+"\""+split_lastarg.at(k)+"\",";
103  }
104  }
105  jsonstr=jsonstr+"\""+split_lastarg.at(split_lastarg.size()-1)+"\"]"+std::string(split_str.size()-1,'}');
106  }
107  }
108 
109  Json::Value js;
110  Json::Reader reader(Json::Features::all());
111  reader.parse(jsonstr, js);
112  return js;
113 
114 }
115 
116 
117 void UpdateJson(Json::Value& a, Json::Value const& b) {
118  if (!a.isObject() || !b.isObject()) return;
119  for (auto const& key : b.getMemberNames()) {
120  if (a[key].isObject()) {
121  UpdateJson(a[key], b[key]);
122  } else {
123  a[key] = b[key];
124  }
125  }
126 }
127 
128 Json::Value MergedJson(int argc, char* argv[]) {
129  Json::Value res(Json::objectValue);
130  if (argc >= 1) {
131  for (int i = 1; i < argc; ++i) {
132  if (boost::algorithm::iends_with(argv[i], ".json")) {
133  Json::Value val = ExtractJsonFromFile(argv[i]);
134  UpdateJson(res, val);
135  } else {
136  Json::Value val = ExtractJsonFromString(argv[i]);
137  UpdateJson(res, val);
138  }
139  }
140  }
141  return res;
142 }
143 
144 Json::Value MergedJson(std::vector<std::string> const& vec) {
145  Json::Value res(Json::objectValue);
146  for (auto const& str : vec) {
147  if (boost::algorithm::iends_with(str, ".json")) {
148  Json::Value val = ExtractJsonFromFile(str);
149  UpdateJson(res, val);
150  } else {
151  Json::Value val = ExtractJsonFromString(str);
152  UpdateJson(res, val);
153  }
154  }
155  return res;
156 }
157 }
Json::Value MergedJson(int argc, char *argv[])
Create a single merged Json::Value from a mixture of json files and json-formatted strings...
Definition: JsonTools.cc:128
Json::Value ExtractJsonFromFlatString(std::string const &str)
Extracts a Json::Value from the given input string.
Definition: JsonTools.cc:29
void UpdateJson(Json::Value &a, Json::Value const &b)
Updates the values in one json from the values in another.
Definition: JsonTools.cc:117
Json::Value ExtractJsonFromString(std::string const &str)
Extracts a Json::Value from the given input string.
Definition: JsonTools.cc:22
Definition: CaloJet.hh:9
Json::Value ExtractJsonFromFile(std::string const &file)
Extracts a Json::Value from the specified input file.
Definition: JsonTools.cc:10