Johnson hit a short jumper with 3:40 left to give Atlanta its first lead since the second quarter, and extended it to 88-83 the next trip down with a 3-pointer from the wing.
It was Orlando's first preseason loss after winning three straight, and pushes Atlanta's exhibition record to 3-1.
Dwight Howard had 27 points, 10 rebounds and six assists for Orlando, which absorbed its first loss after winning three straight exhibition games. Jameer Nelson scored 12 in his first preseason action since crashing into Howard a week and a half ago in a scrimmage, giving him a concussion and a gash on his face requiring nine stitches.
Nelson hit some clutch shots, including a driving layup with 1:37 left that cut Atlanta's lead to 90-89, but seemed to force others down the stretch.
Atlanta made five of 12 3-pointers, while Orlando hit only 4-of-17 from behind the arc.
Rookie Shelden Williams, whom the Magic badly wanted out of this year's draft, had 12 points and 10 rebounds for the Hawks, who committed 22 turnovers.
Orlando led 42-35 at halftime and increased its lead to 14 early in the third quarter.
Keyon Dooling scored 15 for Orlando and Keith Bogans added 10 points. Grant Hill was held out to rest.