Liam Sabino hit a single with two outs and then Jackson came up with his timely hit to give the Cardinals the go-ahead run.
The Cardinals improved to 29-36, one game ahead of the Reds, as both teams try to avoid being the last-place team in the Appalachian League West Division standings.
Cole Aker, who pitched the final three innings for Johnson City, improved to 3-2 on the season. He gave up one walk with two outs in the bottom of the ninth with the tying run at first and the winning run at the plate. But Greeneville’s Raul Juarez popped up in foul territory and Johnson City first baseman Dariel Gomez made the catch to end the game.
Johnson City had nine hits overall with Sabino the only player with multiple hits, going 2-for-4 with the winning run scored. Starting pitcher Christ Hunt threw six innings, striking out six, not allowing any walks and giving up just five hits.
He got a no decision, although the Cardinals took a 2-0 lead in the top of the third.
Brandon Purcell and Luis Flores opened the inning with back-to-back hits. Donovan Williams followed up with a sacrifice fly to center field and later in the inning, Leandro Cedeno provided an RBI double.
Greeneville responded with one run in the bottom of the third and then had the tying run in the sixth.
Reds starter Ricky Archer also went six innings in a no decision, while Johnnie Schneider (2-4) suffered the loss.
Johnson City hosts Kingsport in a season-ending, three-game series starting Monday night at 7.