Johnson reacted quickest to a Rickie Lambert header which hit the bar, after the visitors went close on numerous occasions, with Bojan Krkic hitting the post and Mame Biram Diouf denied by Raheem Sterling’s clearance.
After a drab opening 45 minutes, the game opened up massively and both sides spurned some superb opportunities. Lucas and Joe Allen both missed chances inside the box, while Bojan drew a spectacular stop from Simon Mignolet in stoppage time.
But the hosts held off some late Stoke pressure to record their first win in November and alleviate some of the pressure mounting on manager Brendan Rodgers.
Rodgers rested captain Steven Gerrard on the 16th anniversary of his debut for the club, with Philippe Coutinho coming in, while Kolo Toure was given the nod ahead of Dejan Lovren in central defence and Jose Enrique started in place of Alberto Moreno.
Stoke, meanwhile, were without Victor Moses after the winger was injured against Burnley, so Marko Arnautovic filled in on the left wing. Mark Hughes also made two changes at the back, with Marc Wilson and Erik Pieters coming in.
The crowd were left frustrated in the opening 45 minutes as Liverpool failed to impose themselves in the middle of the park, even after Stoke had to withdraw Steve Sidwell early on, with the midfielder failing to recover from a 50-50 challenge with Rickie Lambert.
Glenn Whelan, who replaced the injured Sidwell, had to be withdrawn himself at the break and Charlie Adam was introduced against his former club. The midfielder almost had an effect straight away, but at the wrong end as he gave the ball straight to Sterling before recovering to cut out his pass for Lambert.
Moments later Henderson, who was captain in place of Gerrard, drilled a volley inches wide as Liverpool started to find their feet.
Rodgers’ men were almost caught out at the other end as Bojan found Diouf in behind and, with Mignolet electing not to come out, the striker tested the goalkeeper for the first time in the match, forcing a low save from the Liverpool shot-stopper.
Things continued to open up, and Bojan flew in from the left before drilling a shot against the near post, then moments later Sterling dragged a left-footed effort inches wide.
Sterling was involved again as he intercepted Arnautovic’s pass and Liverpool momentarily had five against three. The winger played in Lucas, but the Brazilian’s lack of goals shone through as he drilled his shot straight at Begovic.
Allen then spooned a close-range shot over after some neat play from Coutinho and Sterling as the hosts just couldn’t find the back of the net, while Stoke looked like they would rue their missed chances.
Mark Hughes must have thought it wouldn’t be his side’s day when a corner fell to Diouf six yards out, but his shot on the turn was blocked on the line by Sterling.
Just a couple of minutes later the deadlock was finally broken, and Gerrard was inevitably involved in the build-up. The midfielder’s cross was met by Lambert, who powered a header against the crossbar and Johnson reacted quickest, charging in to head the ball low into the net.
It was a huge blow for Stoke, who would have felt they could have taken all three points, but they couldn’t get back on level terms despite some late pressure inside the Liverpool half.
Soccer Saturday reaction – Charlie Nicholas
I didn’t think Liverpool deserved it. Stoke were worthy of something from the game. It’s about the three points for Liverpool – but Mark Hughes will think his side should have won this game, never mind got a point. I thought Stoke were pretty good today.
Not a great deal happened in the first half; Stoke’s shape was good and Liverpool didn’t really hurt them. But the second half exploded. Charlie Adam has got a beautiful left foot but he’s not really a holding player, he doesn’t have the discipline, and that meant the game started to spread and there was a lot of space.
Everything that was good from Liverpool came through Sterling but it was Johnson who got the winner with about five minutes to go, heading in after Lambert’s header had come back off the crossbar.
Bojan was much, much better in the second half and had smashed one against the post after skipping past a couple of players. If he’d just been more clinical with his final pass in the first half then it would have opened up – and if Stoke had scored first they’d have won this match.
Liverpool: Mignolet (7), Johnson (7), Skrtel (6), Toure (6), Enrique (7), Lucas (6), Allen (5), Henderson (6), Coutinho (7), Sterling (8), Lambert (6).
Used subs: Gerrard (7), Lovren (6).
Stoke: Begovic (6), Cameron (7), Shawcross (7), Wilson (5), Pieters (6), N’Zonzi (6), Sidwell (5), Walters (6), Bojan (7), Arnautovic (6), Diouf (7).
Used subs: Whelan (5), Adam (6), Crouch (6).
Man of the match: Raheem Sterling