Жезус начал свою карьеру в молодёжной команде «Интернасьонала». Во взрослой команде Жуан дебютировал в 2010 году и за свой первый сезон сыграл 7 матчей. В сезоне 2011 года Жуан периодически выходил в основном составе и за чемпионат сыграл 18 матчей. В январе 2012 года появилась информация, что молодым бразильским защитником заинтересовался миланский «Интер». В течение всего трансферного окна шли переговоры о приобретении Жуана и в итоге в последней день переход состоялся. Дебют Жезуса в составе «нерадзурри» состоялся в матче последнего тура против «Лацио», когда молодой бразильский футболист вышел в компенсированное время, заменив Диего Милито. Свой первый матч в еврокубках бразилец провел в рамках квалификационного раунда ЛЕ против румынского «Васлуя». Жуан вышел на замену на 82-й минуте, заменив Уэсли Снейдера. В сезонах 2012/13, 2013/14 и 2014/15 был игроком основы «Интера», проведя в сумме за это время более 110 матчей. 14 июля 2016 года Жезус присоединился к Роме. 28 октября 2019