static void GenStat(Stat* s, JSON_Value* v) { switch (json_value_get_type(v)) { case JSONObject: { JSON_Object* o = json_value_get_object(v); size_t count = json_object_get_count(o); for (size_t i = 0; i < count; i++) { const char* name = json_object_get_name(o, i); GenStat(s, json_object_get_value(o, name)); s->stringLength += strlen(name); } s->objectCount++; s->memberCount += count; s->stringCount += count; } break; case JSONArray: { JSON_Array* a = json_value_get_array(v); size_t count = json_array_get_count(a); for (int i = 0; i < count; i++) GenStat(s, json_array_get_value(a, i)); s->arrayCount++; s->elementCount += count; } break; case JSONString: s->stringCount++; s->stringLength += strlen(json_value_get_string(v)); break; case JSONNumber: s->numberCount++; break; case JSONBoolean: if (json_value_get_boolean(v)) s->trueCount++; else s->falseCount++; break; case JSONNull: s->nullCount++; break; } }
static void GenStat(Stat* s, UJObject v) { switch (UJGetType(v)) { case UJT_Object: { void* iter = UJBeginObject(v); UJString key; UJObject value; while (UJIterObject(&iter, &key, &value)) { s->memberCount++; s->stringCount++; s->stringLength += key.cchLen; GenStat(s, value); } s->objectCount++; } break; case UJT_Array: { void* iter = UJBeginArray(v); UJObject value; while (UJIterArray(&iter, &value)) { GenStat(s, value); s->elementCount++; } s->arrayCount++; } break; case UJT_String: { size_t length; UJReadString(v, &length); s->stringCount++; s->stringLength += length; } break; case UJT_Long: case UJT_LongLong: case UJT_Double: s->numberCount++; break; case UJT_True: s->trueCount++; break; case UJT_False: s->falseCount++; break; case UJT_Null: s->nullCount++; break; default:; } }
static void GenStat(Stat* s, json_object* v) { switch (json_object_get_type(v)) { case json_type_object: { json_object_object_foreach(v, key, val) { GenStat(s, val); s->stringCount++; s->stringLength += strlen(key); s->memberCount++; } s->objectCount++; } break; case json_type_array: for (int i = 0; i < json_object_array_length(v); i++) GenStat(s, json_object_array_get_idx(v, i)); s->elementCount += json_object_array_length(v); s->arrayCount++; break; case json_type_string: s->stringCount++; s->stringLength += json_object_get_string_len(v); break; case json_type_int: case json_type_double: s->numberCount++; break; case json_type_boolean: if (json_object_get_boolean(v)) s->trueCount++; else s->falseCount++; break; break; case json_type_null: s->nullCount++; break; }
static void GenStat(Stat* s, const json_val_t * v) { switch (v->type) { case JSON_OBJECT_BEGIN: for (int i = 0; i < v->length; i++) { GenStat(s, v->u.object[i]->val); s->stringLength += v->u.object[i]->key_length; } s->objectCount++; s->memberCount += v->length; s->stringCount += v->length; break; case JSON_ARRAY_BEGIN: for (int i = 0; i < v->length; i++) GenStat(s, v->u.array[i]); s->arrayCount++; s->elementCount += v->length; break; case JSON_STRING: s->stringCount++; s->stringLength += strlen(v->u.str_val); break; case JSON_INT: case JSON_FLOAT: s->numberCount++; break; case JSON_TRUE: s->trueCount++; break; case JSON_FALSE: s->falseCount++; break; case JSON_NULL: s->nullCount++; 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; } }
static void GenStat(Stat* s, json_t* v) { switch (json_typeof(v)) { case JSON_OBJECT: { const char *key; json_t *value; json_object_foreach(v, key, value) { GenStat(s, value); s->stringLength += strlen(key); s->stringCount++; s->memberCount++; } s->objectCount++; } break; case JSON_ARRAY: { size_t arraySize = json_array_size(v); for (size_t i = 0; i < arraySize; i++) GenStat(s, json_array_get(v, i)); s->arrayCount++; s->elementCount += arraySize; } break; case JSON_STRING: s->stringCount++; s->stringLength += json_string_length(v); break; case JSON_REAL: case JSON_INTEGER: s->numberCount++; break; case JSON_TRUE: s->trueCount++; break; case JSON_FALSE: s->falseCount++; break; case JSON_NULL: s->nullCount++; break; }
virtual bool Statistics(const ParseResultBase* parseResult, Stat* stat) const { const ParsonParseResult* pr = static_cast<const ParsonParseResult*>(parseResult); if (pr != nullptr) { memset(stat, 0, sizeof(Stat)); GenStat(stat, (JSON_Value*)pr->root); return true; } else { return false; } }
virtual bool Statistics(const ParseResultBase* parseResult, Stat* stat) const { const VinenthzParseResult* pr = static_cast<const VinenthzParseResult*>(parseResult); memset(stat, 0, sizeof(Stat)); GenStat(stat, pr->root); return true; }
virtual bool Statistics(const ParseResultBase* parseResult, Stat* stat) const { const GasonParseResult* pr = static_cast<const GasonParseResult*>(parseResult); memset(stat, 0, sizeof(Stat)); GenStat(*stat, pr->value); return true; }