Both clubs started the match with good high pressing against each other as they looked to score the first goal.
Alvaro Morata almost gave Juventus the lead early on as he blocked a clearance from Pietro Terracciano in the Fiorentina goal.
From then on, it was a very open game with both clubs having a go at each other, but Juve looked to be under more pressure in the early stages and Fiorentina ambitiously pressed them very high.
Again, Morata nearly opened the scoring for Juventus after a mistake by Alvaro Odriozola, but he was forced wide and Paulo Dybala skied his cut back.
Both clubs continued to struggle to find the opening goal of the game, but neither really came close at the half-hour mark.
Riccardo Saponara then wasted a fine chance to give Fiorentina the lead with a half volley after some fine work by the troublesome Odriozola, but he hoofed his shot.
Danilo got a yellow card late in the first half after stopping Gaetano Castrovilli from breaking free.
From the free kick, the Brazilian appeared to touch the ball with his hands. However, after a VAR check for a potential penalty, Juventus survived and the referee blew for halftime.
Luca Pellegrini replaced Alex Sandro at the start of the second half, as the Brazilian had been run ragged by Odriozola in the first 45.
Morata again threatened to score the first goal of the game after controlling the ball well, but his volley was wide.
Both clubs kept having a go at each other, but clear cut opportunities were hard to come by.
After several moments of both clubs struggling to break each other down, a member of the Fiorentina coaching staff was sent off by referee Simone Sozza.
A few minutes later Nikola Milenkovic was also dismissed for a second yellow after fouling Federico Chiesa, who was looking to break for Juventus. The Serbian had deserved it all evening.
With 15 minutes to go, Chiesa then smashed the underside of the crossbar from a tight angle.
Max Allegri subbed on Juan Cuadrado for Adrien Rabiot as Juventus looked to take advantage of being a man to the good, but Fiorentina continued to defend well.
With 10 minutes to play, Morata had the ball in the back of the net, but it was ruled out for offside.
Minutes later, the lively Chiesa tested Terracciano with a great shot, but he saved well.
With two minutes of normal time to play, Kaio Jorge replaced Morata as Juve looked for the elusive winning goal.
A minute into added time, substitute Juan Cuadrado scored with a delightful shot from a tight angle and gave Juventus all three points.
The Bianconeri didn’t look to be at their best but they will take the three points.