Johnson (4-4) held the Red Sox to four hits, issued only one walk and struck out seven while turning in his seventh straight start of allowing three runs or fewer.
Steve Cishek tossed a scoreless eighth inning and Heath Bell closed out the victory with his 13th save for Miami, which took the opener of a three-game series.
Donovan Solano drove in a pair of runs with an RBI single and sacrifice fly while Gaby Sanchez added a run-scoring hit during a three-run first inning for Miami.
Boston starter Josh Beckett (4-7) lost for the third straight outing, yielding four runs on six hits over seven innings.
Scott Podsednik went 3-for-4 with a run scored for Boston, which has lost four straight.