Johnson (7-7) limited the Cubs to two hits and a walk, while striking out four for Arizona, which won for just the third time in seven games.
Chad Qualls got his second save of the season, but he had to work out of a jam to do it. Qualls issued a walk to Ryan Theriot to open the ninth and Theriot advanced to second as Kosuke Fukudome legged out an infield hit. Derek Lee hit into a double-play, sending Theriot to third, but Aramis Ramirez then grounded out to end the game.
The Diamondbacks managed only two hits, but made them count -- with Alex Romero smacking a solo homer and Stephen Drew stroking an RBI triple.
Rich Harden (0-1) took the loss despite allowing just one hit, Romero's homer. Harden struck out 10 and walked two.
Reed Johnson and Jim Edmonds had the two hits for the Cubs, who have lost four of their last five games.