Shane Victorino took advantage with his bat and arm the next inning.
Victorino drove in the go-ahead run with a triple in the 10th, then threw out Gregor Blanco at the plate as the tying run in the bottom of the inning as the Phillies beat the Atlanta Braves 4-3 on Friday night.
The Phillies took advantage of Johnson's error to tie the game 2-2.
The second baseman dropped a pop fly by Chris Coste with two outs in the ninth for an error, allowing Eric Bruntlett to score the tying run from second. Johnson threw out Pedro Feliz, who tried to score from first on the play, to end the inning. Braves fans, on their feet to cheer the expected win, were too stunned to even boo.
"It just didn't stick," Johnson said. "It hit the palm. That's probably the one spot in your glove it's going to pop out."
Manny Acosta (3-4) lost for the second time in three days, giving up two hits and two runs while recording only one out.
Acosta gave up a leadoff double to pinch-hitter Chris Snelling in the 10th. Pinch-runner So Taguchi moved to third on a sacrifice and scored on Victorino's triple to right-center, his second of the game. Chase Utley added a run-scoring double off Royce Ring, what proved to be a true insurance run when the Braves started to rally in the bottom of the inning.
With one out, Josh Anderson singled off closer Brad Lidge and moved to third on Blanco's infield hit. Blanco stole second, but Lidge struck out Greg Norton. Yunel Escobar then drove in Anderson with a single to center, but Victorino threw out Blanco on a close play at the plate to end the game.
"I knew I had to charge the ball hard and get rid of it quick," Victorino said. "I knew it would be a close play. I wanted to give the catcher [Coste] a chance."
Coste said Victorino's strong throw almost caught him off-guard.
"He threw it so hard I didn't have time to adjust," Coste said. "It was a line drive."
Braves manager Bobby Cox argued the call with home plate umpire Alfonso Marquez but after watching the replay said Blanco was out.
"We gave it away. We didn't lose it, we gave it," Cox said. "Bad baserunning, drop a pop-up.
"Kelly catches everything. I've never seen him drop one. We're all allowed one."
The Braves didn't score after loading the bases in the third and seventh innings and botched a suicide squeeze in the sixth.
"You can't try and give away a game as many times as we did tonight," said Chipper Jones of the Braves. "Bad baserunning, not executing squeezes, defense was not good at critical times. We can't do that with premier clubs."
Tom Gordon (5-2) earned the win and Lidge got his 16th save.
Cox said Rafael Soriano, who earned his third save Thursday night, was not available to protect the ninth-inning lead. Soriano returned on May 28 after missing 45 games with elbow tendinitis.
Johnson's seventh error took a win from Tim Hudson, who allowed five hits and one run in 7 2/3 innings. He walked four and struck out three.
"It was an unfortunate mistake for them, but tonight it worked out for us," Victorino said. "[Johnson] has always been a sound defensive player. It could happen to anyone."
Jones, who had four hits, including his 400th home run, on Thursday night, was 2-for-3 with two walks, raising his batting average to .421.
The Phillies took a 1-0 lead in the first. Victorino's liner to center field fell beyond the reach of a diving Blanco, allowing Victorino to race to third with a triple and score on Utley's grounder to second base.
Moyer made the lead stand until the sixth. Mark Teixeira led off with a single to left. With one out, McCann pulled a knee-high, 3-2 pitch into the right-field seats for a two-run home and a 2-1 lead.
It was the second straight day a homer by McCann gave the Braves a lead. This time they couldn't make it stand.
The Phillies are 4-3 in extra-inning games, and the Braves fell to 1-6 in extra innings and 3-17 in one-run games. ... With the two hits and two walks, Jones' on-base percentage is .504. ... Phillies SS Jimmy Rollins, who was benched Thursday for failing to hustle on a pop fly, was back in the lineup. ... Norton, held out of Thursday's game with a sore knee, came into the game as a defensive replacement in the 10th.