The JSON reference states:
 any-Unicode-character-
     except-"-or-\\-or-
     control-character
Then lists the standard escape codes:
  \" Standard JSON quote
  \\ Backslash (Escape char)
  \/ Forward slash
  \b Backspace (ascii code 08)
  \f Form feed (ascii code 0C)
  \n Newline
  \r Carriage return
  \t Horizontal Tab
  \u four-hex-digits
From this I assumed that I needed to escape all the listed ones and all the other ones are optional. You can choose to encode all characters into \uXXXX if you so wished, or you could only do any non-printable 7-bit ASCII characters or characters with Unicode value not in \u0020 <= x <= \u007E range (32 - 126). Preferably do the standard characters first for shorter escape codes and thus better readability and performance.
Additionally you can read point 2.5 (Strings) from RFC 4627.
You may (or may not) want to (further) escape other characters depending on where you embed that JSON string, but that is outside the scope of this question.