Cody Ross hit a solo homer and Wes Helms added a tying sacrifice fly in the eighth inning, helping the Marlins, losers of eight of their previous 11 games, rally past the Arizona Diamondbacks 5-4 on Friday night.
"One of the better games we've played in the past three or four weeks," Ross said. "We've been struggling, everybody knows it, but we're pulling together."
It spoiled a 13-strikeout performance by Johnson, who pitched seven strong innings but was denied career victory No. 295.
"He certainly pitched well enough to win," Arizona manager Bob Melvin said. "He pitches quite a few games like that, where we don't score a whole lot of runs. Seems like they're always close games."
The Diamondbacks maintained a two-game lead over Los Angeles in the NL West but missed a chance to stretch the lead to three games after the Dodgers lost in Philadelphia.
Arizona's Stephen Drew hit a tying RBI single in the seventh and Chris Young added an RBI double off the wall in left to give the Diamondbacks a 4-3 lead. That would have put Johnson in the win column, but the Marlins struck when Jon Rauch (0-2) replaced Johnson in the eighth.
Josh Willingham led off with what appeared to be a home run, but it bounced off left fielder Connor Jackson's glove as he dropped back to the wall, then hit a bar and fell back into play on the slumped Jackson.
Asked if he's a fan of baseball's instant replay review proposal, Willingham said: "I'm glad I made contact. To get a hit is even better."
Indeed, it was exactly the kind of situation made for replay. Perhaps because they won, the Marlins didn't complain much.
"They did their best," Florida manager Fredi Gonzalez said. "The umpires got together to try to get it right. That's all you can ask for. If this thing [replay] comes along, hopefully it can help out."
The ruling was a triple, and Willingham scored easily when Helms drove the ball deep into left for a sacrifice fly. Florida led 5-4 after one more pitch, when Ross, who hit a two-out RBI double in the fourth, drove it into the left-field stands for his 18th homer.
"I was just trying to get the bat on the ball," Ross said. "Fortunately, I got some good wood on it and it went out."
Rauch left a few sliders over the plate.
"I wish I had an explanation for it," he said. "I have no excuses for it. Just bad execution of pitches and leaving pitches that are way too good in the zone. Obviously, a team like that can swing it a little bit."
Arizona threatened in the bottom of the eighth. Miguel Montero and Augie Ojeda each hit one-out singles, but pinch-hitter Alex Romero lined a shot off the pitcher's mound that second baseman Dan Uggla flipped to begin a double play.
"It caught a perfect break," Ross said. "It was just a momentum changer. It was one of those plays where when you see it and on your team, you say, 'Oh, we're going to win this game.' "
Florida starter Anibal Sanchez hadn't faced the Diamondbacks since throwing a no-hitter against them on Sept. 6, 2006. But he allowed a single to the first batter he faced and gave up five hits by the time Arizona took a 2-0 lead.
He settled down and retired 15 of the next 17 batters through the following 4 1/3 innings. Sanchez wound up pitching 6 1/3 innings, allowing eight hits and four runs. He had seven strikeouts, walked one and hit two batters.
Sanchez left after Drew and Young put Arizona up 4-3, when Gonzalez called for Rhodes. He intentionally walked Jackson to load the bases with one out for Adam Dunn, who'd been batting .194 against lefties.
Rhodes found the corner on a called third strike to retire Dunn, then got Chad Tracy to fly out to center.
"It was a big win for us," Rhodes said. "Everybody did their job."
It also spoiled a big night by the Big Unit. Johnson allowed five hits and three runs, two earned, with an intentional walk. It was his 212th game with at least 10 strikeouts, ranking second all-time behind Nolan Ryan (215).
It was vintage Johnson.
"For a little while, anyway," the 44-year-old Johnson said. "Then I think my age caught up with me and I got a little tired in the last inning. It just seemed like a lot culminated in that one inning."
Twice this season Johnson had 10-strikeout efforts -- May 24 in a loss at Atlanta and during a July 6 win at San Diego.
Johnson threw the most strikeouts since he had 15 on Aug. 31, 2004, in a 4-1 loss to the Dodgers. His 116 pitches were his most since throwing 129 on July 19, 2006, against Seattle. ... The Marlins are 6-1 against the Diamondbacks this season. ... Arizona RHP Brandon Webb was sore after being hit by a liner just below his rib cage while earning his 19th win Thursday. He throws a regular bullpen session Saturday. ... Marlins LHP Andrew Miller (patella tendinitis) pitched 5 2/3 innings on a rehab assignment at Double-A Carolina. He gave up two hits and two runs, and makes another start for Carolina next week. ... Florida outrighted RHP Justin Miller to Triple-A Albuquerque.