4 * Created on: 06.11.2014
11 #include "AliJSONData.h"
12 #include "AliJSONReader.h"
14 AliJSONSyntaxTreeNode::AliJSONSyntaxTreeNode(const char *name, AliJSONSyntaxTreeNode *mother):
23 AliJSONSyntaxTreeNode:: ~AliJSONSyntaxTreeNode() {
25 for(std::vector<AliJSONData *>::iterator it = fEntries.begin(); it != fEntries.end(); it++){
29 for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = fDaughters.begin(); it != fDaughters.end(); it++){
34 void AliJSONSyntaxTreeNode::AddEntry(AliJSONData *entry) {
35 fEntries.push_back(entry);
38 AliJSONSyntaxTreeNode *AliJSONSyntaxTreeNode::CreateDaughter(const char *name){
39 AliJSONSyntaxTreeNode *daughter = new AliJSONSyntaxTreeNode(name, this);
40 fDaughters.push_back(daughter);
44 void AliJSONSyntaxTreeNode::SetOwner(bool owner) {
46 for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = fDaughters.begin(); it != fDaughters.end(); it++)
47 (*it)->SetOwner(owner);
50 AliJSONReader::AliJSONReader() {
54 AliJSONReader::~AliJSONReader() {
57 TList* AliJSONReader::Decode(const char* jsonstring) const {
60 * 1st create the abstract syntax tree
61 * 2nd serialise the abstract syntax tree it into a TList
63 AliJSONSyntaxTreeNode * ast = new AliJSONSyntaxTreeNode("", NULL),
66 TString jsontstring(jsonstring);
67 jsontstring.ReplaceAll(" ","");
69 // First strip away the left and right brackets
70 int first(jsontstring.First('{')+1), last(jsontstring.Last('}'));
71 jsontstring = jsontstring(first, last-first+1);
72 bool hasNext = jsontstring.Length() > 0;
73 while(hasNext){ // Create the abstract syntax tree
74 if(jsontstring[0] == '}'){
75 current = current->GetMotherNode();
76 jsontstring = jsontstring(1, jsontstring.Length()-1);
77 if(!(jsontstring.Length() || current)) hasNext = false;
80 // Find the next separator
81 int separator = jsontstring.First(':');
82 if(separator == kNPOS){
86 TString key = jsontstring(0,separator-1);
87 key.ReplaceAll("\"", "");
88 jsontstring = jsontstring(separator + 1, jsontstring.Length() - (separator + 1));
89 if(jsontstring[0] == '{'){
90 // Handle complicated object
91 current = current->CreateDaughter(key.Data());
92 jsontstring = jsontstring(1,jsontstring.Length()-1);
94 // Handle simple value
95 separator = jsontstring.First(',');
96 if(separator == kNPOS){
97 separator = jsontstring.First('}');
99 TString value = jsontstring(0, separator -1);
100 jsontstring = jsontstring(separator+1, jsontstring.Length() - (separator + 1));
101 value.ReplaceAll("\"", "");
102 current->AddEntry(new AliJSONData(key.Data(), value.Data()));
107 ast->SetOwner(false);
109 // Serialise it into a TList
110 TList *entries = new TList;
111 std::vector<AliJSONData *> &rootnodeentries = ast->GetEntries();
112 for(std::vector<AliJSONData *>::iterator it = rootnodeentries.begin(); it != rootnodeentries.end(); it++)
114 std::vector<AliJSONSyntaxTreeNode *> &daughters = ast->GetDaughters();
115 for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = daughters.begin(); it != daughters.end(); it++)
116 AddNodeToList(*it, entries);
120 void AliJSONReader::AddNodeToList(AliJSONSyntaxTreeNode* node, TList* consumer) const {
121 TList *entries = new TList;
122 entries->SetName(node->GetName());
123 std::vector<AliJSONData *> &nodeentries = node->GetEntries();
124 std::vector<AliJSONSyntaxTreeNode *> &daughters = node->GetDaughters();
125 for(std::vector<AliJSONData *>::iterator it = nodeentries.begin(); it != nodeentries.end(); it++)
127 for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = daughters.begin(); it != daughters.end(); it++)
128 AddNodeToList(*it, entries);
129 consumer->Add(entries);