JSON serialization: reject duplicate keys in hashtables
* src/json.c (lisp_to_json_toplevel_1): Reject duplicate keys in hashtables. * test/src/json-tests.el (json-serialize/object-with-duplicate-keys): Add unit tests.
This commit is contained in:
parent
c7a5074027
commit
3455192777
2 changed files with 14 additions and 1 deletions
|
@ -352,7 +352,12 @@ lisp_to_json_toplevel_1 (Lisp_Object lisp, json_t **json)
|
||||||
/* We can't specify the length, so the string must be
|
/* We can't specify the length, so the string must be
|
||||||
null-terminated. */
|
null-terminated. */
|
||||||
check_string_without_embedded_nulls (key);
|
check_string_without_embedded_nulls (key);
|
||||||
int status = json_object_set_new (*json, SSDATA (key),
|
const char *key_str = SSDATA (key);
|
||||||
|
/* Reject duplicate keys. These are possible if the hash
|
||||||
|
table test is not `equal'. */
|
||||||
|
if (json_object_get (*json, key_str) != NULL)
|
||||||
|
wrong_type_argument (Qjson_value_p, lisp);
|
||||||
|
int status = json_object_set_new (*json, key_str,
|
||||||
lisp_to_json (HASH_VALUE (h, i)));
|
lisp_to_json (HASH_VALUE (h, i)));
|
||||||
if (status == -1)
|
if (status == -1)
|
||||||
/* FIXME: A failure here might also indicate that the
|
/* FIXME: A failure here might also indicate that the
|
||||||
|
|
|
@ -52,6 +52,14 @@
|
||||||
(should (equal (json-serialize table)
|
(should (equal (json-serialize table)
|
||||||
"{\"abc\":[1,2,true],\"def\":null}"))))
|
"{\"abc\":[1,2,true],\"def\":null}"))))
|
||||||
|
|
||||||
|
(ert-deftest json-serialize/object-with-duplicate-keys ()
|
||||||
|
(skip-unless (fboundp 'json-serialize))
|
||||||
|
(let ((table (make-hash-table :test #'eq)))
|
||||||
|
(puthash (copy-sequence "abc") [1 2 t] table)
|
||||||
|
(puthash (copy-sequence "abc") :null table)
|
||||||
|
(should (equal (hash-table-count table) 2))
|
||||||
|
(should-error (json-serialize table) :type 'wrong-type-argument)))
|
||||||
|
|
||||||
(ert-deftest json-parse-string/object ()
|
(ert-deftest json-parse-string/object ()
|
||||||
(skip-unless (fboundp 'json-parse-string))
|
(skip-unless (fboundp 'json-parse-string))
|
||||||
(let ((input
|
(let ((input
|
||||||
|
|
Loading…
Add table
Reference in a new issue