Rather than allowing any CL S-expression (except that all symbols must be
keywords), I propose that you allow only a more restricted variety of
S-expressions so that they can be readily read and processed in any other
language, while being compatible with a whole bunch of Lisp's read (without
full validation) and print/write functions.
Specifically I propose POSE <
which allows only a restricted set of symbols, arbitrary integers, floats,
and strings, and lists. (Most of that page is the rationale, which does
not need to be read unless it interests you).
Code is provided to parse POSE in many languages, but the CL is not up to
date, as it does not yet handle keywords, only colon-free identifiers.
(But of course there is no reason not to use your own code if you want.)