private static JsonObject parseObj(Buffer<Token> buf) throws JsonParseException
	{
		Token tkn = buf.next();
		
		if (!"{".equalsIgnoreCase(tkn.str))
		{
			throw new JsonParseException("Found \"%s\" at line %s, col %s; Was expecting \"{\"", tkn.str, tkn.line, tkn.col);
		}
		
		JsonObject ret = new JsonObject();
		boolean kill = false;
		
		while (!"}".equalsIgnoreCase((tkn = buf.next(false)).str))
		{
			skipWhitespace(buf);
			
			String name = parseString(buf);
			
			skipWhitespace(buf);
			
			tkn = buf.next();
			
			if (!":".equalsIgnoreCase(tkn.str))
			{
				throw new JsonParseException("Found \"%s\" for keypair %s at line %s, col %s; Was expecting \":\"", tkn.str, name, tkn.line, tkn.col);
			}
			
			skipWhitespace(buf);
			
			Object data = parseValue(buf);
			
			if (!ret.add(name, data))
			{
				throw new JsonParseException("Duplicate key: %s", name);
			}
			
			skipWhitespace(buf);
			
			tkn = buf.next();
			
			if (!",".equalsIgnoreCase(tkn.str))
			{
				if (kill)
				{
					throw new JsonParseException("Found \"%s\" at line %s, col %s; Was expecting a comma", tkn.str, tkn.line, tkn.col);
				}
				
				kill = true;
				
			}
			
			skipWhitespace(buf);
			
		}
		
		return ret;
	}