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.
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.
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.
Arthur Rhodes (1-0) got two outs in the seventh to earn the win, his first in the NL after a July 31 trade from Seattle. Kevin Gregg pitched a perfect ninth for his 28th save in 35 chances.
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 manager Fredi 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.