Johnson started his career in the youth system of West Bromwich Albion, where he spent seven years as a schoolboy. In summer 2013, he was offered a scholarship by West Bromwich, but opted to leave and join Stevenage, where he felt he had a better chance of playing first-team football. Johnson trained regularly with the first-team straight away, alongside starting a two-year scholarship. Johnson appeared numerous times on the bench throughout the 2013–14 season, making his professional debut on the final day of the season, on 3 May 2014, in a 2–0 away defeat to Brentford. In doing so, he became Stevenage's youngest ever debutant at the age of 17 years and 215 days.
Loan spells
He played a peripheral role during the 2014–15 season, making all four of his appearances for Stevenage in the opening two months of the season. This included being sent-off for two bookable offences within the space of six minutes in a 2–1 away loss at Bury on 16 September 2014. A month later, on 24 October 2014, Johnson joined the Conference South club Boreham Wood on a one-month loan deal in order to "gain valuable first-team experience". He made one appearance during the brief spell, as a 90th-minute substitute in Boreham Wood's 2–1 win over Maidenhead United on 10 November 2014. He returned to Stevenage later that month and went on to appear for the club's development squad for the remainder of the season. The 2015–16 season followed a similar course with Johnson appearing regularly in the match-day squad, but often as an unused substitute, as he made seven appearances for the club during the season. Ahead of the 2016–17 season, Johnson was loaned to the National League South side St Albans City with teammate Dipo Akinyemi until January 2017. The loan move came about after Johnson had spoken to the Stevenage manager Darren Sarll and informed him he wanted game-time. He made his debut on the opening day of the new season, playing the whole match as St Albans secured a 2–0 home win over Concord Rangers at Clarence Park. Johnson scored his first competitive goal in St Albans' 2–1 victory over Chelmsford City on 16 August 2016, heading in from close range from a corner. He received a knee injury while on international duty in September 2016 and was ruled out of action for two months, returning to the St Albans first team at the start of December 2016. In his second game back from injury, Johnson scored the opening goal in a 2–0 away win at Margate on 6 December 2016. Johnson was recalled by Stevenage at the end of the month, a month earlier than the initial agreement. He made 12 appearances during the spell, scoring twice. Despite returning to Stevenage earlier than planned, Johnson did not appear for the first team during the second half of the season. In April 2017, he spent a week on trial at the Premier League side Tottenham Hotspur, playing 77 minutes in the development team's 4–1 loss to Everton U23s. No move materialised, and at the end of the month he enjoyed another week-long trial period, this time at Norwich City, playing the whole match in a 0–0 draw with Brighton & Hove Albion U23s. Despite interest from Premier League and Championship clubs, Johnson remained at Stevenage and in July 2017, before the 2017–18 season, he rejoined Boreham Wood on a season-long loan deal. After two starting appearances in Boreham Wood's opening three fixtures, Johnson did not appear again and the loan deal was cut short in December 2017. In January 2018, Johnson was loaned once again, this time joining the National League North club Nuneaton Town for the remainder of the season. The move meant he was going to be playing under the manager Dino Maamria, who had previously coached him during his early years at Stevenage. Johnson made his Nuneaton debut in a 2–0 loss to Brackley Town on 6 January 2018. He was a mainstay in the centre of defence during his time at Nuneaton, making 19 appearances.
International career
Johnson was first called up to represent Northern Ireland at U21 level in September 2015, when he played the whole match in a 2–1 loss to Scotland U21s in a 2017 UEFA European U21 Championship qualifier. Three days later, on 8 September 2015, he scored his first international goal in a 1–1 away draw with Iceland U21s in Reykjavík, scoring with a powerful header from a corner. He went on to make four appearances, scoring once, as Northern Ireland finished bottom of the qualification group. He remained a mainstay in the centre of defence for the U21s for their 2019 UEFA European U21 Championship qualifiers. Johnson scored his second goal at U21 level when he opened the scoring in a 4–2 home win over Estonia U21s on 10 October 2017.