The ninth-inning rally was sparked by Daniel Murphy and David Wright, who hit back-to-back singles to lead off the frame against Marlins closer Steve Cishek. Lucas Duda cut Miami's lead to one with a one-out single before Cishek walked Andres Torres. Kelly Shoppach drove in the deciding runs on a bases-loaded single to center field that was misplayed by Justin Ruggiano, clearing the bases.
"Things like that, that situation in this game, no matter where you are in the season, those are always big moments," said Shoppach, who is hitting .346 with seven RBIs since a midseason trade to the Mets. "Not only personally, but as far as the momentum we have going for us."
Shoppach entered the game on defense in the bottom of the eighth, and he joked that he was panicking that his first at-bat of the night came in a decisive situation.
The catcher had faced Cishek just once before, but got plenty of pitches to see from the side-armed reliever while on deck during Torres' seven-pitch battle that ultimately loaded the bases with two outs.
Shoppach lined the second pitch he saw from Cishek to center field for a two-run single, and the ball trickled under Ruggiano's glove to allow a third run to score.
"It's disappointing," said Cishek, who had converted 10 straight save opportunities before Saturday. "I didn't fool anyone today. They squared it up pretty good and ground balls didn't find anyone and they got the job done. It happens."
The late rally came after the Mets were unable to get much going against Marlins righty Josh Johnson. Johnson hurled eight innings of three-hit ball, allowing just one run.
"Give credit to Josh Johnson, he did a great job tonight," Shoppach said. "We didn't think we had much of a chance and then ... we got out there and started to gain confidence as a team."
Johnson held the Mets hitless through four innings, only surrendering a pair of walks -- one in the second and another in the fourth. The Mets finally got to Johnson in the fifth, when Mike Baxter led off with a double. Baxter came around to score and tie the game when Josh Thole grounded out to shortstop.
Thole singled to lead off the eighth to snap an 0-for-30 drought at the plate, but Justin Turner bounced into a double play before Johnson escaped the frame with a 2-1 lead the Marlins built off Mets rookie Jeremy Hefner.
Hefner threw six innings and gave up two runs on six hits to follow up his last start, an eight-inning, one-run effort against the Astros. The righty walked just one batter and struck out four Saturday, but he didn't factor into the decision thanks to the Mets' late-inning heroics.
Asked if Hefner is exceeding expectations, Collins said, "He really is. I thought tonight was, location-wise, the best I've seen him pitch, and he's pitched very well."
The only runs against Hefner came in the third, when Bryan Petersen smacked a two-out double to left-center field to score Donovan Solano, and in the sixth, when Giancarlo Stanton hit a dribbler down the first-base line with runners on the corners.
Hefner fielded the ball off Stanton's bat and checked to see if he had a chance to make a play at home on the speedy Jose Reyes. Hefner's indecision allowed Stanton to beat out the play at first and break a 1-1 tie.
Miami stretched the lead to two runs in the bottom of the eighth, when Reyes reached on a walk and stole second -- his 30th steal of the season and 400th of his career -- before Carlos Lee drove him in with a single against Ramon Ramirez, who wound up with the win.
That set up the Mets' rally, which gave them their sixth win in seven games and clinched the team's third straight series victory.
"That was awesome to fight back like that," said Hefner, who watched the comeback from the dugout. "Cishek is a good pitcher and that shows the fight in this team. It was fun to watch.