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
|
#ifndef RGW_JSON_H
#define RGW_JSON_H
#include <include/types.h>
#include <iostream>
#include <fstream> // for testing DELETE ME
#include "json_spirit/json_spirit.h"
using namespace std;
using namespace json_spirit;
class JSONObj;
class JSONObjIter {
typedef map<string, JSONObj *>::iterator map_iter_t;
map_iter_t cur;
map_iter_t last;
public:
JSONObjIter();
~JSONObjIter();
void set(const JSONObjIter::map_iter_t &_cur, const JSONObjIter::map_iter_t &_end);
void operator++();
JSONObj *operator*();
bool end() {
return (cur == last);
}
};
class JSONObj
{
JSONObj *parent;
protected:
string name; // corresponds to obj_type in XMLObj
Value data;
string data_string;
multimap<string, JSONObj *> children;
map<string, string> attr_map;
void handle_value(Value v);
public:
JSONObj() : parent(NULL){};
virtual ~JSONObj();
void init(JSONObj *p, Value v, string n);
string& get_name() { return name; }
string& get_data() { return data_string; }
bool get_data(const string& key, string *dest);
JSONObj *get_parent();
void add_child(string el, JSONObj *child);
bool get_attr(string name, string& attr);
JSONObjIter find(const string& name);
JSONObjIter find_first();
JSONObjIter find_first(const string& name);
JSONObj *find_obj(const string& name);
friend ostream& operator<<(ostream& out, JSONObj& obj); // does not work, FIXME
bool is_array();
bool is_object();
vector<string> get_array_elements();
};
class RGWJSONParser : public JSONObj
{
int buf_len;
string json_buffer;
bool success;
public:
RGWJSONParser();
virtual ~RGWJSONParser();
void handle_data(const char *s, int len);
bool parse(const char *buf_, int len);
bool parse(int len);
bool parse();
bool parse(const char *file_name);
const char *get_json() { return json_buffer.c_str(); }
void set_failure() { success = false; }
};
#endif
|