From 94e0e5592ad531a577f4249564da8688d9d9ebea Mon Sep 17 00:00:00 2001 From: Edward O'Connor Date: Tue, 21 Aug 2012 21:29:22 -0400 Subject: strict key encoding for json.el Ref: http://lists.gnu.org/archive/html/emacs-devel/2012-08/msg00642.html * lisp/json.el (json-key-format): Add error properties. (json-encode-key): New function. (json-encode-hash-table, json-encode-alist, json-encode-plist): Use json-encode-key. --- lisp/ChangeLog | 7 +++++++ lisp/json.el | 19 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'lisp') diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 748fab9dbe..4f8de2291d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2012-08-22 Edward O'Connor + + * json.el (json-key-format): Add error properties. + (json-encode-key): New function. + (json-encode-hash-table, json-encode-alist, json-encode-plist): + Use json-encode-key. + 2012-08-22 Glenn Morris * calendar/cal-tex.el (cal-tex-longday): New function, replacing... diff --git a/lisp/json.el b/lisp/json.el index 468358ccd1..f1ee3a5203 100644 --- a/lisp/json.el +++ b/lisp/json.el @@ -174,6 +174,10 @@ this around your call to `json-read' instead of `setq'ing it.") (put 'json-string-format 'error-conditions '(json-string-format json-error error)) +(put 'json-key-format 'error-message "Bad JSON object key") +(put 'json-key-format 'error-conditions + '(json-key-format json-error error)) + (put 'json-object-format 'error-message "Bad JSON object") (put 'json-object-format 'error-conditions '(json-object-format json-error error)) @@ -321,6 +325,15 @@ representation will be parsed correctly." "Return a JSON representation of STRING." (format "\"%s\"" (mapconcat 'json-encode-char string ""))) +(defun json-encode-key (object) + "Return a JSON representation of OBJECT. +If the resulting JSON object isn't a valid JSON object key, +this signals `json-key-format'." + (let ((encoded (json-encode object))) + (unless (stringp (json-read-from-string encoded)) + (signal 'json-key-format (list object))) + encoded)) + ;;; JSON Objects (defun json-new-object () @@ -395,7 +408,7 @@ Please see the documentation of `json-object-type' and `json-key-type'." (maphash (lambda (k v) (push (format "%s:%s" - (json-encode k) + (json-encode-key k) (json-encode v)) r)) hash-table) @@ -409,7 +422,7 @@ Please see the documentation of `json-object-type' and `json-key-type'." (format "{%s}" (json-join (mapcar (lambda (cons) (format "%s:%s" - (json-encode (car cons)) + (json-encode-key (car cons)) (json-encode (cdr cons)))) alist) ", "))) @@ -418,7 +431,7 @@ Please see the documentation of `json-object-type' and `json-key-type'." "Return a JSON representation of PLIST." (let (result) (while plist - (push (concat (json-encode (car plist)) + (push (concat (json-encode-key (car plist)) ":" (json-encode (cadr plist))) result) -- cgit v1.2.3