ST. LOUIS -- Josh Johnson showed why he's one of the top starters in the majors on Wednesday.
Even without his best stuff, the right-hander was good enough to shut down the St. Louis Cardinals.
Johnson struck out nine in six effective innings to lead the Florida Marlins to a 5-2 victory over the Cardinals.
Cody Ross had three hits and drove in two runs for Florida, which has won 10 of 14 to stay in the playoff race. Ross extended his hitting streak to 11 games, the longest current streak in the NL, and was 5 for 12 in the series.
Florida (78-68) moved within four games of wild card-leading Colorado, which was at San Francisco on Wednesday night.
"This is a resilient team," Marlins manager Fredi Gonzalez said. "They forget bad losses quickly and go on to the next game."
Johnson (15-4) gave up nine hits but allowed just one run in his 23rd quality start of the season. He struck out five and walked none, improving to 3-1 with a 3.14 ERA in his last five starts.
"They made good contact with the ball," Johnson said. "I'd throw good pitches and they'd get hits. It was one of those days where I didn't walk anybody. That was huge for me today."
The Cardinals rallied in the ninth. Jason LaRue walked with one out and Mark DeRosa followed with a double to left. Gonzalez then replaced Brian Sanches with closer Leo Nunez, whose wildness got the Marlins into more trouble.
"I really focused on throwing the fastball low and away," said Nunez, who had hit only two batters in his previous 68 innings. "I just wanted to get the ground ball and I got it."
Central-leading St. Louis fell to 1-5 on its nine-game homestand and lost back-to-back series for the first time since June 22-28 against the New York Mets and Minnesota.
Joel Pineiro (14-11) gave up four runs and 10 hits in 5 1/3 innings for St. Louis.
Johnson helped himself in the second, leading off with an infield single before eventually coming home on Jorge Cantu's sacrifice fly.
Julio Lugo had an RBI single in the sixth for St. Louis, which has scored two or fewer runs in four of its last five losses.
"I'm not worried at all about our offense," St. Louis manager Tony La Russa said. "Good pitching stops good hitting. I really like this club we have."
Florida rookie Chris Coghlan singled in the second inning, giving him an NL-best 83 hits since the All-Star break. ... The first 17 hits in the game were singles. ... The teams split the six-game season series. ... St. Louis closer Ryan Franklin, who blew his last two save opportunities, pitched a scoreless ninth inning. ... The Cardinals were 1 for 13 with runners in scoring position.