The lead changed hands several times in an entertaining Group H game in Helsinki which finished 4-4 in regulation time after Canada's Duncan Keith fired home with 99 seconds left on the clock.
Columbus Blue Jackets defenseman Johnson stepped up to win it for the US, grabbing his second goal of the game after Canada's John Tavares was sent to the sinbin for delaying tactics.
It was only the second US victory over their neighbours since 1985.
In the day's other game in Group H, captain Mark Streit scored twice and added an assist as Switzerland crushed Kazakhstan 5-1.
Roman Savchenko netted the consolation goal for Kazakhstan.
In the Group S games in Stockholm, Russia swept past Latvia 5-2 while more than 10,000 fans turned up to watch Sweden beat Czech Republic 4-1.
Tournament organisers were relieved to see more home fans after Sweden's opening game against Norway on Friday attracted a 7,770 crowd to an arena that holds 13,850.