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; } } }
double traverse_gason(JsonValue o) { double x = 0; switch (o.getTag()) { case JSON_TAG_NUMBER: x += o.toNumber(); break; case JSON_TAG_ARRAY: case JSON_TAG_OBJECT: for (auto i : o) { x += traverse_gason(i->value); } break; default: return 0; } return x; }
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; } }