static void dumpJsonValue(const JsonValue& val) { static int level = 0; level++; assert(level < 10); if(const JsonArray* arr = val.toArray()) { printf("["); //printf("%p", arr); for(size_t i=0; i<arr->size(); i++) { if(i != 0) printf(", "); dumpJsonValue((*arr)[i]); } printf("]"); } else if(const JsonObject* obj = val.toObject()) { printf("{%p", obj); #if 0 for(JsonObject::iterator itr = obj->begin(); itr != obj->end(); ++itr) { if(itr != obj->begin()) printf(", "); printf("%s:", itr->first.c_str()); dumpJsonValue(*itr->second); } #endif printf("}"); } else { printf("%s", val.toString().c_str()); } level--; }
void OnData( const happyhttp::Response* r, void* userdata, const unsigned char* data, int n ) { std::cout << "reading...\n"; char *endptr; JsonValue value; JsonAllocator allocator; JsonParseStatus status = jsonParse((char*)data, &endptr, &value, allocator); if (status != JSON_PARSE_OK) { fprintf(stderr, "error at %zd, status: %d\n", endptr - (char*)data, status); exit(EXIT_FAILURE); } else { // SUCCESS switch (value.getTag()) { case JSON_TAG_NUMBER: printf("%g\n", value.toNumber()); break; case JSON_TAG_BOOL: printf("%s\n", value.toBool() ? "true" : "false"); break; case JSON_TAG_STRING: printf("\"%s\"\n", value.toString()); break; case JSON_TAG_ARRAY: for (auto i : value) { auto bleh = i->value; } break; case JSON_TAG_OBJECT: for (auto i : value) { printf("%s = ", i->key); } break; case JSON_TAG_NULL: printf("null\n"); break; } } }
static void GenStat(Stat& stat, const JsonValue& v) { switch (v.getTag()) { case JSON_ARRAY: for (auto const& i : v) { GenStat(stat, i->value); stat.elementCount++; } stat.arrayCount++; break; case JSON_OBJECT: for (auto const& i : v) { GenStat(stat, i->value); stat.memberCount++; stat.stringLength += strlen(i->key); stat.stringCount++; // Key } stat.objectCount++; break; case JSON_STRING: stat.stringCount++; stat.stringLength += strlen(v.toString()); break; case JSON_NUMBER: stat.numberCount++; break; case JSON_TRUE: stat.trueCount++; break; case JSON_FALSE: stat.falseCount++; break; case JSON_NULL: stat.nullCount++; break; } }
void NewsScene::printReturn(JsonValue o) { switch (o.getTag()) { case JSON_TAG_NUMBER: printf("%g\n", o.toNumber()); //sum += o.toNumber(); break; case JSON_TAG_BOOL: printf("%s\n", o.toBool() ? "true" : "false"); break; case JSON_TAG_STRING: { string theValue =o.toString(); setValue(theValue); } break; case JSON_TAG_ARRAY: for (auto i : o) { // tmpNews = new News(); listNews.push_back(new News()); printReturn(i->value); } break; case JSON_TAG_OBJECT: for (auto i : o) { printf("%s = ", i->key); lastKey = i->key; printReturn(i->value); } break; case JSON_TAG_NULL: printf("null\n"); break; } }
static void dumpValue(std::ostringstream& os, const JsonValue& o, int shiftWidth, const std::string& linefeed = "", int indent = 0) { switch (o.getTag()) { case JSON_NUMBER: char buffer[32]; sprintf(buffer, "%f", o.toNumber()); os << buffer; break; case JSON_TRUE: os << "true"; break; case JSON_FALSE: os << "false"; break; case JSON_STRING: dumpString(os, o.toString()); break; case JSON_ARRAY: // It is not necessary to use o.toNode() to check if an array or object // is empty before iterating over its members, we do it here to allow // nicer pretty printing. if (!o.toNode()) { os << "[]"; break; } os << "[" << linefeed; for (auto i : o) { if (shiftWidth > 0) os << std::setw(indent + shiftWidth) << " " << std::setw(0); dumpValue(os, i->value, shiftWidth, linefeed, indent + shiftWidth); if (i->next) os << ","; os << linefeed; } if (indent > 0) os << std::setw(indent) << " " << std::setw(0); os.put(']'); break; case JSON_OBJECT: if (!o.toNode()) { os << "{}"; break; } os << "{" << linefeed; for (auto i : o) { if (shiftWidth > 0) os << std::setw(indent + shiftWidth) << " " << std::setw(0); dumpString(os, i->key); os << ":"; dumpValue(os, i->value, shiftWidth, linefeed, indent + shiftWidth); if (i->next) os << ","; os << linefeed; } if (indent > 0) os << std::setw(indent) << " " << std::setw(0); os.put('}'); break; case JSON_NULL: os << "null"; break; } }