The hard-throwing Marlins ace relied more heavily on his curveball than usual and pitched seven innings for his first victory in more than a year, helping Miami beat the Pittsburgh Pirates 6-2.
Johnson (1-3) had gone winless in 12 starts since his most recent victory on April 19, 2011.
''I feel like it has been about two years,'' the 2010 NL ERA leader said. ''Wins have been tough at times to come by.''
Johnson missed the final 4 1/2 months of last season because of right shoulder inflammation. There's been speculation his velocity is down this year, but Johnson said his problem has been too many pitches in the middle of the plate.
''It's all about location,'' he said. ''I can throw 88 to 92, and if the fastball's down, it's just as effective as throwing 95 or 96 and being a little more up.''
Johnson said he didn't even wonder how hard he was throwing against the Pirates, in part because his best pitch was his curve. He estimated that at least 20 of his 99 pitches were curveballs.
''He had his great stuff,'' said Michael McKenry, who homered for Pittsburgh when Miami was up 6-1. ''If you give him a lead, it's kind of tough.''
Miami's Omar Infante tied a career high with four hits, including a two-run single. Hanley Ramirez had three hits and two RBIs, and John Buck singled home the other two runs.
The Marlins have the best record in the majors this month at 11-3. They concluded a 3-2 homestand and split the two-game series.
Kevin Correia (1-4) lasted only 3 2-3 innings, his shortest outing this year, and gave up a season-high six runs. He fell to 0-4 in his past five starts.
''My command just wasn't real good,'' Correia said. ''When I miss, it's a pretty good lineup, and they're going to take advantage of it.''
Johnson allowed a run in the first inning, but after the first two batters singled in the third, he retired 13 of the next 14 hitters before McKenry homered. He gave up six hits and two runs and struck out six.
''I'm very happy for JJ,'' manager Ozzie Guillen said. ''He threw good. Hopefully with this game he gets back on track. He's our ace. Hopefully he starts pitching like he is.''
Johnson was the Marlins' opening day starter this season but endured several rough outings. With the victory, he reduced his ERA to 5.36 and improved his career record to 49-26.
Edward Mujica and Randy Choate completed the six-hitter and lowered Miami's team ERA this month to 2.86. The rotation has 28 quality starts, which is tied for the most in the majors.
''I just want to be part of it,'' Johnson said. ''Every one of us can go out there and throw a complete game. It's fun to watch, and fun to be a part of.''
The Marlins knocked out Correia when they scored five runs in the fourth to take a 6-1 lead. Buck drove in two runs with a bases-loaded single, Infante also had a two-run single and Ramirez doubled home a run.
Miami, which came into the game last in the majors in batting with runners in scoring position, went 4 for 12 in those situations.
The Pirates scored in the first inning for the fourth consecutive game. Andrew McCutchen walked with two outs, advanced on a single by Pedro Alvarez and scored on Garrett Jones' single.
Ramirez tied the score with an RBI double in the bottom of the first. He later beat out a squibber that started in foul territory and slowly spun fair before pitcher Chris Resop scooped it up.
''I've never seen the pitcher let the ball go fair,'' Guillen said. ''That's going to be in my book.''
Notes: Before the game, the Marlins recalled OF Bryan Petersen from Triple-A New Orleans. ... Marlins RF Giancarlo Stanton robbed Jones when he made a running, leaping catch before slamming into the fence in the fourth inning. ... McCutchen went 1 for 3 and is batting .441 this month. ... Correia has an ERA of 8.39 in six starts against the Marlins. ... Miami's Emilio Bonifacio stole a base and is 19 for 19 to lead the majors. ... Marlins 1B Gaby Sanchez, batting .198, was given the night off. ... Attendance was a palindromic 24,242.
- Miami Marlins