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 < https://github.com/s-expressions/pose/blob/master/README.adoc#specification%..., 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.)