As a freshman at Auburn in 2015, Johnson was a backup to future NFL starter Peyton Barber and Jovon Robinson, and never reached 10 rushes or 40 rushing yards in a game, though he was used occasionally as a kick returner and reached 161 all-purpose yards against Kentucky. On the year, he rushed 208 yards on 52 carries with three touchdowns. As a sophomore in 2016, he began the season starting six games, before becoming the backup to Kamryn Pettway, recording 895 rushing yards on 182 carries and 11 touchdowns. He had six touchdowns and 512 rushing yards through his first five games, averaged eight carries for 33 yards and one touchdown through the next three as a backup, returned to form with games of 99 and 108 yards and a touchdown each in relief, before ending the season with a 39-yard game against #1 Alabama in the Iron Bowl, and a 33-yard game in the Sugar Bowl loss to Oklahoma, though he did throw for a touchdown in the contest.
As a junior in 2017, Johnson became the Tigers' dominant rusher, with almost three times as many carries as any other player on the team. He rushed for over 100 yards in ten of the team's twelve regular season contests, including 204 yards and three touchdowns against Ole Miss, 233 yards-from-scrimmage and a touchdown in a win over #2 Georgia, and 104 yards with both a rushing and a passing touchdown in a signature victory over #1 Alabama in the regular season finale. However, the #4 Tigers lost the SEC Championship in a rematch with Georgia, where Johnson was limited to 44 yards. In the subsequent Peach Bowl, Johnson had 71 rushing yards and a touchdown in the loss to #10 Central Florida. On the season, he recorded 1,391 yards (sixth best season in school history) on 285 carries for 18 rushing touchdowns (third) and 20 total touchdowns, leading the SEC in all four categories. He ended his career at Auburn with 2,494 career rushing yards (11th in school history), 32 rushing touchdowns (tied for fourth).
On January 2, 2018, Johnson announced that he would forgo his senior year and enter the 2018 NFL Draft.
He was drafted by the Detroit Lions in the second round (43rd overall) of the 2018 NFL Draft. He was the sixth running back to be selected that year. The Detroit Sports Media association awarded Johnson its 2019 Lions-DSM Rookie of the Year Award.
Johnson made his NFL debut in the season opener against the New York Jets on Monday Night Football. In the 48–17 loss, he had five carries for 17 yards and three receptions for 20 yards. In a 26–10 Sunday Night Football victory over the New England Patriots in Week 3, Johnson rushed for 101 yards, becoming the first Lions' player since Reggie Bush in 2013 to rush for more than 100 yards. The performance won him the starting role over LeGarrette Blount, which he used to score his first NFL touchdown the following week against the Dallas Cowboys though he was limited to just nine carries. He added 70 yards against the Green Bay Packers before the Week 6 bye. In Week 7 against the Miami Dolphins, Johnson rushed for 158 yards on 19 carries with an additional 21 yards on two catches in a 32–21 victory. Nearly half of his rushing yards came on a 71-yard carry early in the game. He was second-youngest Lions' player to reach 150 yards rushing by just three days to Barry Sanders, and the first Lions' player of any age since Jahvid Best in 2011. He expanded his role in the passing game with career bests of six receptions for 69 yards in Week 8, and after just 43 yards-from-scrimmage in Week 9, notched both a rushing and his first career receiving touchdown in Week 10 loss to the Chicago Bears. In the Week 11 win over the Carolina Panthers, Johnson had 87 yards a touchdown before spraining his left knee in the third quarter and missed the next four games. He was placed on injured reserve on December 19, 2018.