MIAMI -- Josh Johnson felt as good as he had all season despite leaving with a cut on the middle finger of his throwing hand.
"I felt in control the whole time," Johnson said. "I felt I didn't have to work real hard on my delivery. Everything was kind of clicking."
|More on Braves-Marlins|
|More MLB coverage|
Four relievers combined to pitch the final three innings for Miami, including Steve Cishek, who recorded his third save in six chances to help the Marlins snap a five-game losing streak.
Johnson (6-7) retired the first 14 batters he faced before Brian McCann singled to right in the fifth.
"When Mac got the base hit, I went 'Whew,' because [Johnson] had no-hit stuff, if not perfect-game stuff," Braves third baseman Chipper Jones said.
"He had all his pitches today," Braves manager Fredi Gonzalez said. "We're a majority left-handed hitting team and those guys were coming back shaking their heads."
Johnson struck out nine, allowed one hit and did not walk a batter. He threw 53 of his 87 pitches for strikes before Marlins manager Ozzie Guillen pulled him as a precaution.
"That's the best I've seen in a little while," Guillen said. "Unfortunately, that's the way we roll."
Gonzalez was ejected in the ninth for arguing with first base umpire Laz Diaz after Diaz called Jason Heyward out to complete a double play.
"Unfortunately, there are two handful of games every year that are decided by the men in black," Jones said. "We didn't get the call on a pretty obvious call at first base. It really cost us a chance to get something going and put some pressure on them."
Jones followed with an RBI single to pull the Braves within 2-1 before Scott Cousins made a sliding catch in center field to rob Freddie Freeman of a hit and end the game.
Carlos Lee had an RBI single in the first inning and Bonifacio, starting in place of Omar Infante at second base, led off the second with his first home run since Sept. 25, 2011, at Milwaukee.
"That's definitely a good feeling," Bonifacio said of his rare home run. "I wasn't looking for that, but it was a really good feeling especially with the way J.J. was throwing the ball and giving him a 2-0 lead."
Braves starter Mike Minor (5-7) allowed two runs and six hits in seven innings.
"First inning was a little rough just because I made some OK pitches and they snuck in there for some hits," Minor said. "Then later on, Bonifacio took that one down the middle and hit it out of the ball park."
Before the game, Miami traded Infante and Anibal Sanchez to the Detroit Tigers for three prospects, including former first-round draft pick Jacob Turner.
"We lost a couple of guys that we thought we had all the way until the end, but unfortunately we're not playing good enough to keep those guys," Guillen said.
Miami came into the season with high expectations after landing coveted free agents Jose Reyes, Mark Buehrle and Heath Bell, but they came in 11½ games out of first place in the NL East and eight games behind the wild card-leading Braves.
The Marlins acquired Lee on July 4 to bolster their lineup and make a push in the standings, but they are only 6-9 since the trade.
"After a bad day, a great win," Guillen said.
Atlanta recalled OF Jose Constanza from Triple-A Gwinnett and optioned RHP Anthony Varvaro. ... Marlins 3B Hanley Ramirez (right hand laceration) is expected to return to the lineup Tuesday for the first time since July 19. ... Sanchez went 44-45 with a 3.75 ERA in 132 starts for the Marlins over seven years, including a no-hitter on Sept. 6, 2006 against Arizona. ... Braves RHP Tim Hudson (8-4, 3.70 ERA) will start Tuesday night against LHP Buehrle (9-9, 3.29 ERA).