Australia need a further five wickets to win in the second innings, with South Africa chasing 482 for victory.
The left-arm quick followed up with three wickets in the second innings after he claimed 7/68 in the first.
Johnson picked up his only wicket of the session, as he removed South African batsman JP Duminy who struggled for his 10 runs off 60 balls.
Duminy whipped a legside delivery straight to Alex Doolan at short leg as South fell to 128 for five.
Hashim Amla (35) was out first in the session, half an hour after lunch, edging to Shaun Marsh at slip off the bowling of Ryan Harris.
Added to his already large wicket-tally, Johnson struck Proteas allrounder Ryan McLaren on his ear with a bouncer just before the interval.
Johnson returned figures of 3/45 while AB de Villiers (39) and McLaren (4) were the batsmen in the middle at the break.
Before lunch, Alviro Petersen was first to depart for South Africa, caught behind by wicketkeeper Brad Haddin, bowled Johnson. A length delivery outside off drew an edge from the opener, and Haddin took an easy catch as South Africa lost their first wicket with the score on six.
The strike also brought up Johnson’s 250th wicket in Tests.
Proteas captain Graeme Smith soon followed his opening partner back to the changeroom.
The double strike left the Proteas struggling at 12 for two inside four overs.
Faf du Plessis (18) fell to a delivery which kept low, as he was out leg-before-wicket to Peter Siddle just before the interval.
Before the Proteas came in to bat, Australia faced 3.2 overs for the addition of two runs to reach 290 for four, a lead of 481, before they declared.
Resuming on an overnight total of 288 for three, Shaun Marsh was out caught behind by De Villiers, bowled Dale Steyn without adding to his overnight total of 44.
At the fall of the wicket, the declaration immediately followed.
Australia scored 397 in their first innings to South Africa’s 206, a lead of 191.