Looks like the new serialiser inherited a bug from the old code: `json-insert` in a unibyte buffer does not move point correctly. Example: (with-temp-buffer (set-buffer-multibyte nil) (json-insert "é") (list (buffer-string) (point))) => ("\"\303\251\"" 4) The string is correct but the position should be 5, not 4. This made me look at the Fjson_insert logic a bit. I'm probably betraying my lack of knowledge about buffer subtleties here, but since the serialiser always produces (correct) UTF-8, shouldn't it be enough to copy the bytes, don't bother with any decoding, and perform the buffer insertion ceremonies? Proposed patch attached. (There will also be a test, of course.)