Jesper Karlsson speelde in de jeugd van IF Böljan, waar hij op veertienjarige leeftijd zijn debuut in het eerste elftal maakte. Na een proefperiode bij GAIS Göteborg vertrok hij in 2015 naar Falkenbergs FF, waar hij op 21 februari 2016 in de met 0-2 gewonnen bekerwedstrijd tegen Tenhults IF zijn debuut maakte. Falkenbergs degradeerde in het seizoen 2016 kansloos uit de Allsvenskan, maar de zestienjarige Karlsson blonk uit en werd met zeven doelpunten clubtopscorer.
Karlsson vertrok naar IF Elfsborg, en bleef zodoende op het hoogste niveau van Zweden actief. Na twee seizoenen waarin hij vooral als invaller in actie kwam, had hij vanaf 2019 een vaste basisplaats bij Elfsborg. Hij kwam in vier jaar tot 95 wedstrijden en 23 goals voor Elfsborg.
In september 2020 vertrok hij voor een bedrag van 2,5 miljoen euro, wat nog hoger op kan lopen, naar AZ.[3] Hij debuteerde voor AZ op 4 oktober 2020, in de met 4-4 gelijkgespeelde uitwedstrijd tegen Sparta Rotterdam, waarin hij twee assists gaf. Op 17 oktober scoorde hij tegen VVV-Venlo zijn eerste doelpunt voor AZ. Op 22 oktober debuteerde hij in de UEFA Europa League tegen Napoli en een week later scoorde hij tegen HNK Rijeka zijn eerste goal in die competitie. Hij miste dat seizoen geen wedstrijd sinds zijn komst en kwam tot elf goals en negen assists in zijn debuutseizoen in de Eredivisie.
Ook in het seizoen 2021/22 was hij onbetwist basisspeler en miste hij alleen het eerste UEFA Europa League-kwalificatieduel met Celtic door een schorsing. In alle competities was Karlsson goed voor 21 doelpunten en zestien assists in 51 wedstrijden. De eerste drie maanden van het seizoen 2022/23 moest Karlsson geblesseerd toekijken, maar bij zijn rentree op 1 oktober tegen FC Groningen (1-4 overwinning) was hij meteen goed voor een doelpunt.
Jesper Karlsson speelde in de Zweedse nationale jeugdelftallen. In 2020 werd hij voor het eerst voor het Zweeds voetbalelftal geselecteerd door bondscoach Janne Andersson. Hij debuteerde voor Zweden op 9 januari 2020, in de met 1-0 gewonnen oefenwedstrijd tegen Moldavië. Hij begon in de basis en werd in de 78e minuut vervangen door Muamer Tanković.