I would rather see (a_value: detachable STRING; a_key: JSON_STRING)
to be similar to the other put_* feature you introduced.

But about string ... does it accept already escaped string ? I guess no.

in fact  I would go for

put_string (a_value: detachable READABLE_STRING_GENERAL; ...)

and we should also add a JSON_STRING.make (READABLE_STRING_GENERAL)