The left-arm fast bowler, who finished with 5-26, was brilliantly supported by fellow paceman Brett Lee (2-42) as India survived just 39 of their 50 overs on a dry pitch.
Wicket-keeper Adam Gilchrist backed his fast bowlers superbly, taking six catches.
Sachin Tendulkar was the lone specialist batsman to offer resistance as he top-scored with 47 in his 400th one-day international. But he received support only from Irfan Pathan (26), adding 49 for the sixth wicket.
It was a 41-run stand for the last wicket between Zaheer Khan (28) and Rudra Pratap Singh (12 not out) that brought India near the 150-mark.
World Cup-winners Australia are now strongly poised to gain an unbeatable 3-1 lead in the seven-match series. The opening one-dayer was abandoned because of rain at Bangalore.
India looked clueless against the quality pace attack and never recovered after losing five wickets for 43 runs in the opening 10 overs.
Johnson removed three batsmen in quick succession in a sharp opening spell just after India had lost two wickets in Lee's opening over to make their worst start in the ongoing series.
Nothing went right for India after skipper Mahendra Singh Dhoni elected to bat as Sourav Ganguly was run out following a misunderstanding with Tendulkar and Rahul Dravid fell for a first-ball duck in Lee's opening over.
Johnson then stole the show with three wickets in four overs, starting with the dismissal of Yuvraj Singh.
It was a smart catch by Gilchrist that accounted for Yuvraj. Gilchrist initially moved to his left before holding an inside-edge low to his right.
Johnson then trapped Robin Uthappa leg-before and had Dhoni caught behind to finish his opening six-over spell with three wickets for just 19 runs.
Tendulkar kept the Australian attack at bay before he was caught behind in Lee's second spell. He hit nine fours in his 73-ball knock.
He is only the second player to reach 400 one-day internationals after Sri Lankan batsman Sanath Jayasuriya.