The hosts also took a winning 3-0 lead in the five-match series after bowling out Sri Lanka for 163 before South Africa captain AB de Villiers starred with an undefeated 60.
In what has become a traditional "pink day" at the Wanderers, with the South African players and most of the capacity crowd wearing pink in support of breast cancer awareness, De Villiers apologised for not providing the feast of run scoring that has marked four previous such occasions.
"The crowd was amazing although we didn't score 300 and hit a lot of sixes," said De Villiers.
"Our focus today was on winning the series and our bowlers did a fantastic job. It wasn't an easy wicket to bat on and if Sri Lanka had got a hundred runs more they could have made it difficult for us."
Sri Lanka captain Upul Tharanga was left to bemoan another sub-standard batting performance, with five batsmen falling to short-pitched bowling.
"We had a very good start but we didn't capitalise. Niroshan Dickwella batted well but didn't have support."
Despite Dickwella's 74, Sri Lanka were bowled out in 39.2 overs after being sent in to bat. It was the third time in as many matches they failed to bat for a full 50 overs.
It was never likely to be enough, although pace bowlers Suranga Lakmal and newcomers Lahiru Kumara and Lahiru Madushanka made the hosts work hard in the early stages of the chase.
Kumara and Madushanka both picked up a wicket while Lakmal had Hashim Amla dropped by wicketkeeper Dinesh Chandimal when the opening batsman was on 12.
Amla went on to make 34 before being run out by a superb throw from deep extra cover by Madushanka.
The left-handed Dickwella was dropped on 25 when JP Duminy, running back from backward point, could not hold on to a high leading edge from Kagiso Rabada's bowling.
He was tested several times by some short-pitched deliveries from South Africa's fast bowlers.
With Dickwella on 55 and looking settled, there was a delay of an hour after a swarm of bees drove the players from the field with the total on 117 for four after 26.3 overs.
The bees were eventually cleared with the help of a local beekeeper who was watching television and rushed to the ground with his equipment and talked his way in.
Dickwella added another 19 runs before his 80-ball innings was ended when he gloved an attempted pull against a short delivery from Dwaine Pretorius to present wicketkeeper Quinton de Kock with his 100th dismissal in 72 one-day internationals. Dickwella hit seven boundaries.
Sri Lanka got off to their best start of the series with Dickwella and Tharanga putting on 60 for the first wicket before Tharanga (31) top-edged a pull against Rabada, one ball after Dickwella had been dropped, and was caught at fine leg.
Seamer Pretorius, playing in his first match of the series in place of Wayne Parnell, took three for 19 and was named man of the match.