Financial terms of the deal weren't immediately known. Johnson is making $4.75 million this season as a first-year arbitration-eligible player.
Johnson, 29, came to Atlanta from Arizona along with Justin Upton prior to last offseason via trade. He would go on to hit .321/.358/.457 (121 OPS+) with 34 doubles, 12 homers and 68 RBI, finishing second in the NL in batting average behind Michael Cuddyer. So far this season, Johnson is hitting .231/.260/.330 through 25 games.
Johnson wasn't set to hit free agency until after the 2016 season, so this new contract will eat up the final two arbitration years and at least one of Johnson's potential free agency years, possibly a second.
News of the agreement was first reported by Ken Rosenthal of Fox Sports.