Unity ships with PlayerPrefs, and it holds three types. Puppy Save writes a real JSON file, holds anything Unity can serialize, and never writes behind your back.
You map a variable once, telling Puppy Save how to read it and how to write it back. From then on, it is saved. Nothing reaches disk until you call Save(), so you decide whether that is on a checkpoint, on a menu close, on quit, or on a timer.