Exemple #1
0
	GArray<GString> GString::Split(GString& str, char const token)
	{
		str.Trim(token);
		GArray<GString> arr;

		size_t lastPos = 0;
		size_t tokenPos = str.Find(token);

		while (tokenPos != -1)
		{
			arr.Add(str.SubString(lastPos, tokenPos - 1));

			lastPos = tokenPos + 1;

			tokenPos = str.Find(token, tokenPos + 1);
		}

		arr.Add(str.SubString(lastPos, str.Size() - 1));

		return arr;
	}	
Exemple #2
0
gbool GJsonPair::Parse(const GString &jsonStr, gsize *cursor, GJsonParserMessage *msg)
{
	Destroy(); // 若已有数据,则先销毁
	GString parse_msg; // 如果发生了错误,返回可能的原因
	gsize _cursor = 0;
	if (cursor)
	{
		_cursor = *cursor;
	}

	gbool has_key = false;
	gsize key_start = GString::NULL_POS;

	while (true)
	{
		gchar c = jsonStr.GetAt(_cursor);
		if (c == '\0')
		{
			// 遇到字符串结束符,解析失败,直接退出
			if (cursor)
			{
				*cursor = _cursor;
			}
			if (msg)
			{
				msg->SetIsSuccess(false);
				msg->SetErrorCursor(_cursor);
				msg->SetErrorMessage("字符串提前结束");
			}
			Destroy();
			return false;
		}
		else if (!G_CHAR_IS_ASCII(c))
		{
			// 遇到非法的字符,解析失败,直接退出
			if (cursor)
			{
				*cursor = _cursor;
			}
			if (msg)
			{
				msg->SetIsSuccess(false);
				msg->SetErrorCursor(_cursor);
				msg->SetErrorMessage("非法的字符");
			}
			Destroy();
			return false;
		}
		else if (G_CHAR_IS_SPACE(c))
		{
			// 空白字符,不做任何操作
		}
		else if (c== '{' || c == '}' || 
			c == '[' || c == ']'||
			c == ',')
		{
			// 解析失败,直接退出
			if (cursor)
			{
				*cursor = _cursor;
			}
			if (msg)
			{
				msg->SetIsSuccess(false);
				msg->SetErrorCursor(_cursor);
				msg->SetErrorMessage("非法的构造字符");
			}
			Destroy();
			return false;
		}
		else if (c == ':')
		{
			if (!has_key)
			{
				// 还没有解析完成Key就遇到了':',解析失败,直接退出
				if (cursor)
				{
					*cursor = _cursor;
				}
				if (msg)
				{
					msg->SetIsSuccess(false);
					msg->SetErrorCursor(_cursor);
					msg->SetErrorMessage("非法的构造字符");
				}
				Destroy();
				return false;
			}
			else
			{
				// 已经解析了Key,说明应该解析JsonValue了
				_cursor++; // 先把光标后移,因为此时光标指向的是':'
				GJsonValue *value = new GJsonValue();
				if (!value->Parse(jsonStr, &_cursor, msg))
				{
					// JsonValue解析失败,释放内存,直接退出
					if (cursor)
					{
						*cursor = _cursor;
					}
					delete value;
					Destroy();
					return false;
				}

				// JsonValue解析成功,跳出循环
				m_pValue = value;
				break;
			}
		}
		else if (c == '"')
		{
			// 遇到了'"',解析Key
			if (has_key)
			{
				// Key已被解析过,解析失败,直接退出
				if (cursor)
				{
					*cursor = _cursor;
				}
				if (msg)
				{
					msg->SetIsSuccess(false);
					msg->SetErrorCursor(_cursor);
					msg->SetErrorMessage("非法的构造字符");
				}
				Destroy();
				return false;
			}
			else
			{
				if (key_start == GString::NULL_POS)
				{
					// Key开始
					key_start = _cursor;
				}
				else
				{
					// Key结束,Key可以为空
					if (_cursor <= key_start)
					{
						// 解析失败,直接退出
						if (cursor)
						{
							*cursor = _cursor;
						}
						if (msg)
						{
							msg->SetIsSuccess(false);
							msg->SetErrorCursor(_cursor);
							msg->SetErrorMessage("非法的构造字符");
						}
						Destroy();
						return false;
					}

					// 解析名称,注意应该去除掉'"'
					m_sKey = jsonStr.SubString(key_start + 1, _cursor - key_start - 1);
					has_key = true;
				}
			}
		}
		else
		{
			// 其他字符串,不做任何操作
		}

		// 光标后移
		_cursor++;
	} // while

	gbool success = (m_pValue != GNULL);
	if (!success)
	{
		// 操作失败,清理内存
		Destroy();
	}

	if (cursor)
	{
		// 将当前光标写入消息
		*cursor = _cursor;
	}
	if (msg)
	{
		// 将信息写入消息
		msg->SetIsSuccess(success);
		if (!success)
		{
			msg->SetErrorCursor(_cursor);
			if (!parse_msg.IsEmpty())
			{
				msg->SetErrorMessage(parse_msg);
			}
			else
			{
				msg->SetErrorMessage("未知的原因");
			}
		}
	}
	return success;
}