Johnson dismissed captain Graeme Smith, Alviro Petersen and Faf du Plessis in a devastating early spell that helped reduce South Africa to 43-4 at one stage. (Agencies)
He finished the day with four wickets - and a stunning one-handed catch - to stymie the home side's attempts at a comeback.
South Africa are 257 runs behind with four wickets remaining after bowling Australia out for 397 just after lunch. They need 58 runs to avoid the follow-on.
Paceman Johnson proved the central figure on a day of dominance for the tourists, as they added 100 runs to their overnight score and then put South Africa under pressure with the ball.
Only AB de Villiers, who was 52 not out at the close, provided any resistance for the top-ranked test nation.
Johnson continued where he had left off during the 5-0 whitewash of England by taking the wicket of captain Smith with his fourth ball and having Africa's other opener, Petersen (2), caught behind in his third over.
Smith, whose hand was broken twice by Johnson in tests in Sydney and Durban five years ago, had made 10 when he tried to evade a short ball and top-edged it high, allowing Shaun Marsh to scramble backwards from first slip for a brilliant catch.
Du Plessis (3), promoted to No.4 in the order after the retirement of Jacques Kallis, lasted only five balls before being caught by Michael Clarke at first slip off a rising delivery in Johnson's fourth over, leaving South Africa in trouble at 23-3.
Hashim Amla was next out, trapped leg before wicket by Peter Siddle for 17.
De Villiers and JP Duminy offered some hope of a prolonged partnership, but after they had put on 67 for the fifth wicket, Johnson ran back from mid-off to catch Duminy one-handed at full stretch after the South African mis-timed a lofted shot off spinner Nathan Lyon.
Ryan McLaren (8) was bowled by Johnson for the sixth wicket.
Robin Peterson was unbeaten on 10 when a sudden thunderstorm brought an end to play, 30 minutes before the scheduled close.
Australia, 297-4 overnight, had waited almost an hour at the start of the day for Steve Smith (100) to get the nine runs needed to complete his fourth test century. He lasted two more deliveries after reaching the landmark.
Marsh, who was 122 overnight, eventually fell for a test-high of 148 in a stylish knock three days after arriving as a late call-up for the injured Shane Watson.
Johnson contributed a valuable 33 with the bat in the lower order before Australia were dismissed soon after lunch.
Johnson dismissed captain Graeme Smith, Alviro Petersen and Faf du Plessis in a devastating early spell that helped reduce South Africa to 43-4 at one stage.