static void ToRapidjsonValue(rapidjson::Value& rapidjsonValue, const JSONValue& jsonValue, rapidjson::MemoryPoolAllocator<>& allocator) { switch (jsonValue.GetValueType()) { case JSON_NULL: rapidjsonValue.SetNull(); break; case JSON_BOOL: rapidjsonValue.SetBool(jsonValue.GetBool()); break; case JSON_NUMBER: { switch (jsonValue.GetNumberType()) { case JSONNT_INT: rapidjsonValue.SetInt(jsonValue.GetInt()); break; case JSONNT_UINT: rapidjsonValue.SetUint(jsonValue.GetUInt()); break; default: rapidjsonValue.SetDouble(jsonValue.GetDouble()); break; } } break; case JSON_STRING: rapidjsonValue.SetString(jsonValue.GetCString(), allocator); break; case JSON_ARRAY: { const JSONArray& jsonArray = jsonValue.GetArray(); rapidjsonValue.SetArray(); rapidjsonValue.Reserve(jsonArray.Size(), allocator); for (unsigned i = 0; i < jsonArray.Size(); ++i) { rapidjson::Value value; rapidjsonValue.PushBack(value, allocator); ToRapidjsonValue(rapidjsonValue[i], jsonArray[i], allocator); } } break; case JSON_OBJECT: { const JSONObject& jsonObject = jsonValue.GetObject(); rapidjsonValue.SetObject(); for (JSONObject::ConstIterator i = jsonObject.Begin(); i != jsonObject.End(); ++i) { const char* name = i->first_.CString(); rapidjson::Value value; rapidjsonValue.AddMember(name, value, allocator); ToRapidjsonValue(rapidjsonValue[name], i->second_, allocator); } } break; default: break; } }