South Africa were 200 for six at tea in reply to Australia's 494 for seven declared.
Harris took three for 44 and Johnson two for 29. Both bowlers gained reverse swing, with the accurate Harris in particular troubling the batsmen with deliveries which dipped in sharply towards right-handers.
Despite losing early wickets, South Africa scored freely during an extended morning's play, reaching 127 for four off 32 overs at lunch.
But the scoring slowed to a trickle after form batsman AB de Villiers was caught at second slip off Johnson for 14 soon after lunch.
JP Duminy fell to a catch behind by Brad Haddin for four and Faf du Plessis and Vernon Philander were forced to defend resolutely in an unbeaten seventh wicket stand of 54.
Only 73 runs were scored off 26 overs between lunch and tea. Du Plessis was on 42 not out after facing 98 balls.
Du Plessis had two escapes. Wicketkeeper Brad Haddin, who took four catches, missed a stumping off Nathan Lyon when Du Plessis was on 30, then dropped a difficult leg side chance off Harris when the batsman was on 35.
With play starting 30 minutes earlier because of rain which cut 51 overs from the second day's play, Australian captain Michael Clarke declared overnight.
It proved a shrewd move because there was early movement off the pitch for the bowlers, with South African captain Graeme Smith caught behind off a ball from Harris which seamed away from him. Smith has made only 42 runs in five innings in the series.
Dean Elgar made 11 before he was superbly caught by Haddin off James Pattinson, the wicketkeeper flinging himself to his right to hold an inside edge by the left-hander.
Alviro Petersen and Hashim Amla added 53 off 58 balls with Petersen reaching a fluent half-century off 50 balls with eight fours.
But Petersen added only three more before he gloved Mitchell Johnson down the leg side for Haddin to take his third catch of the innings.
Amla looked in good form but was bowled for 38 when Harris made a ball swing back sharply to find a gap between bat and pad.