10 #include <mtld/exception.h> 11 #include <mtld/common.h> 14 namespace Mobi {
namespace Mtld {
namespace JSON {
25 std::ostream &operator<< (std::ostream &,
const Type &);
35 Parser(std::istream &f_) : f(f_) {}
38 void parseString(std::string &);
39 template <
typename I>
void parseInt(I &);
40 void parseFloat(
double &);
49 template <
typename Context>
void parseObject(Context &ctx);
55 template <
typename Context>
void parseArray(Context &ctx);
61 unsigned char startNextToken();
67 Parser::parseInt(N &in)
70 char c = startNextToken();
75 }
else if (!isdigit(c)) {
78 for (in = 0; isdigit(c); c = peek()) {
86 template <
typename Context>
88 Parser::parseArray(Context &ctx)
90 int c = startNextToken();
94 if ((c = startNextToken()) ==
']')
97 for (
size_t i = 0;; i++) {
99 ctx.parseElement(
this, i);
101 c = startNextToken();
114 template <
typename Context>
116 Parser::parseObject(Context &ctx)
119 int c = startNextToken();
124 std::string fieldName;
125 switch (startNextToken()) {
127 parseString(fieldName);
128 c = startNextToken();
132 ctx.parseField(
this, fieldName);
152 template <
typename VT,
typename Func>
154 std::vector<VT> &values;
157 void parseElement(
Parser *j,
size_t idx) {
158 if (values.size() <= idx)
159 values.resize(idx + 1);
162 VectorArrayParser(std::vector<VT> &values_, Func f_ = Func()) : values(values_), f(f_) {}
168 template <
typename VT,
typename Func>
170 std::vector<VT> &values;
173 void parseField(
Parser *j, std::string field) {
174 const char *p = field.c_str();
175 unsigned long idx = 0;
177 idx = Mobi::Mtld::Da::ValueChecker::atou<unsigned long>(p);
178 if (values.size() <= idx)
179 values.resize(idx + 1);
182 e <<
" (parse json field)";
186 SparseArrayParser(std::vector<VT> &values_, Func f_ = Func()) : values(values_), f(f_) {}
190 void operator () (
Parser *j, std::string &s) { j->parseString(s); }
193 template <
typename IntegerType =
int>
struct parseIntF {
194 void operator () (
Parser *j, IntegerType &i) { j->parseInt(i); }
197 template <
typename Object,
typename ObjectParser>
struct parseObjectF {
Definition: exception.h:16