Donovan Solano lifted a lazy fly ball in the seventh inning that was dropped by Adam Loewen in left field. The two-base error allowed Chris Coghlan and Bryan Petersen to score.
The Marlins had tied the score at 1 in the sixth inning on Kevin Mattison's RBI single.
New York took the early lead on Ike Davis' RBI double in the first inning off Josh Johnson.
The game was halted for 54 minutes in the third due to rain, which shortened the outings for both starters.
Mets knuckleballer R.A. Dickey was perfect in two innings, striking out one while throwing 23 pitches with 16 strikes.
Johnson worked three innings, giving up a run on five hits, and logging 49 pitches (32 strikes).
The game marked the first time Jose Reyes faced his former team. The four-time All-Star shortstop with the Mets, Reyes was the Marlins' marquee free-agent signing, inking a six-year, $106 million contract.
Reyes had just one at-bat, bouncing back to Dickey to open the first inning.
After some early-inning sprinkles, play was halted in the bottom of the third, as Dickey was completing his warmup.
The Mets strung together three straight one-out hits in the first inning and grabbed the early lead.
Justin Turner singled to right, and advanced to third on Jason Bay's single. Davis delivered a ground-rule RBI double to left-center, taking the ball to the opposite field.
In the top of the eighth inning, Mets manager Terry Collins was ejected for disputing a batter's interference call on Jordany Valdespin.
Up next for the Mets: Johan Santana aims to throw 60 pitches and as many as four innings when the Mets take on the Tigers in a 1:10 p.m. ET game Friday at Digital Domain Park, live on MLB.TV. Santana will be making his third start of the spring in preparation for Opening Day on April 5. Closer Frank Francisco, who has allowed a run in all three of his appearances this spring, is also scheduled to pitch.