forked from jasp-stats/jasp-desktop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjsonutilities.cpp
137 lines (110 loc) · 4.33 KB
/
jsonutilities.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "jsonutilities.h"
std::set<std::string> JsonUtilities::convertDragNDropFilterJSONToSet(std::string jsonStr)
{
std::set<std::string> returnThis;
Json::Value json;
Json::Reader().parse(jsonStr, json);
std::stack<Json::Value> jsonStack;
jsonStack.push(json);
while(jsonStack.size() > 0)
{
Json::Value cur = jsonStack.top();
jsonStack.pop();
if(cur.isArray())
for(int i=0; i<cur.size(); i++)
jsonStack.push(cur[i]);
else if(cur.isObject())
{
if(cur.get("nodeType", "").asString() == "Column")
returnThis.insert(cur.get("columnName", "").asString());
else
for(auto & str : cur.getMemberNames())
jsonStack.push(cur[str]);
}
}
return returnThis;
}
std::string JsonUtilities::removeColumnsFromDragNDropFilterJSONStr(const std::string & jsonStr, const std::vector<std::string> & columnNames)
{
return removeColumnsFromDragNDropFilterJSONStr(jsonStr, std::set<std::string>(columnNames.begin(), columnNames.end()));
}
std::string JsonUtilities::removeColumnsFromDragNDropFilterJSONStr(const std::string & jsonStr, const std::set<std::string> & columnNames)
{
Json::Value json;
Json::Reader().parse(jsonStr, json);
removeColumnsFromDragNDropFilterJSON(json, columnNames);
return json.toStyledString();
}
void JsonUtilities::removeColumnsFromDragNDropFilterJSONRef(Json::Value & json, const std::vector<std::string> & columnNames)
{
removeColumnsFromDragNDropFilterJSONRef(json, std::set<std::string>(columnNames.begin(), columnNames.end()));
}
void JsonUtilities::removeColumnsFromDragNDropFilterJSONRef(Json::Value & json, const std::set<std::string> & columnNames)
{
if(json.isArray())
for(int i=0; i<json.size(); i++)
removeColumnsFromDragNDropFilterJSONRef(json[i], columnNames);
else if(json.isObject())
{
if(json.get("nodeType", "").asString() == "Column" && columnNames.count(json["columnName"].asString()) > 0)
json = Json::nullValue;
else
for(auto & key : json.getMemberNames())
removeColumnsFromDragNDropFilterJSONRef(json[key], columnNames);
}
}
Json::Value JsonUtilities::removeColumnsFromDragNDropFilterJSON(const Json::Value &json, const stringset &columnNames)
{
Json::Value changeThisThen = json;
removeColumnsFromDragNDropFilterJSONRef(changeThisThen, columnNames);
return changeThisThen;
}
Json::Value JsonUtilities::removeColumnsFromDragNDropFilterJSON(const Json::Value &json, const stringvec &columnNames)
{
Json::Value changeThisThen = json;
removeColumnsFromDragNDropFilterJSONRef(changeThisThen, columnNames);
return changeThisThen;
}
std::string JsonUtilities::replaceColumnNamesInDragNDropFilterJSONStr(const std::string & jsonStr, const std::map<std::string, std::string> & changeNameColumns)
{
Json::Value json;
Json::Reader().parse(jsonStr, json);
replaceColumnNamesInDragNDropFilterJSON(json, changeNameColumns);
return json.toStyledString();
}
void JsonUtilities::replaceColumnNamesInDragNDropFilterJSONRef(Json::Value & json, const std::map<std::string, std::string> & changeNameColumns)
{
if(json.isArray())
for(int i=0; i<json.size(); i++)
replaceColumnNamesInDragNDropFilterJSONRef(json[i], changeNameColumns);
else if(json.isObject())
{
if(json.get("nodeType", "").asString() == "Column" && changeNameColumns.count(json["columnName"].asString()) > 0)
json["columnName"] = changeNameColumns.at(json["columnName"].asString());
else
for(auto & key : json.getMemberNames())
replaceColumnNamesInDragNDropFilterJSONRef(json[key], changeNameColumns);
}
}
Json::Value JsonUtilities::replaceColumnNamesInDragNDropFilterJSON(const Json::Value &json, const strstrmap &changeNameColumns)
{
Json::Value changeThisThen = json;
replaceColumnNamesInDragNDropFilterJSONRef(changeThisThen, changeNameColumns);
return changeThisThen;
}
stringvec JsonUtilities::jsonStringArrayToVec(const Json::Value & jsonStrings)
{
if(jsonStrings.isNull()) return {};
if(!jsonStrings.isArray()) throw std::runtime_error("jsonStringArrayToVec expected array!");
stringvec out;
out.reserve(jsonStrings.size());
for(const Json::Value & entry: jsonStrings)
if(!entry.isString()) throw std::runtime_error("jsonStringArrayToVec expected array of strings!");
else out.push_back(entry.asString());
return out;
}
stringset JsonUtilities::jsonStringArrayToSet(const Json::Value &jsonStrings)
{
auto vec = jsonStringArrayToVec(jsonStrings);
return stringset(vec.begin(), vec.end());
}