int JSON_EncodeValue(json_buf* buf, DynamicObject& obj)
{
	switch (obj.type)
	{
	case DO_UNKNOWN:
		return json_write_null(buf);
	case DO_INTEGER:
		return json_write_integer(buf, obj);
	case DO_BOOLEAN:
		return json_write_bool(buf, obj);
	case DO_NUMBER:
		return json_write_number(buf, obj);
	case DO_STRING:
		return json_write_string(buf, obj);
	case DO_ARRAY:
		{
			int len = json_putch(buf, '[');
            size_t size = obj.size();
			for (size_t i = 0; i < size; i++)
			{
				len += JSON_EncodeValue(buf, obj[i]);
				if (i != size - 1)
					len += json_putch(buf, ',');
			}
			len += json_putch(buf, ']');
			return len;
		}
	case DO_OBJECT:
		{
			int len = json_putch(buf, '{');
			std::vector<std::string> keys;
            obj.propertyList(keys);
            size_t size = keys.size();
			for (size_t i = 0; i < size; i++)
			{
				std::string& key = keys[i];
				len += json_write_string(buf, (char*)key.c_str());
				len += json_putch(buf, ':');
				len += JSON_EncodeValue(buf, obj[key]);
				if (i != keys.size() - 1)
					len += json_putch(buf, ',');
			}
			len += json_putch(buf, '}');
			return len;
		}
	default:
		return 0;
	}
}