diff options
| author | Simen Heggestøyl | 2015-10-03 23:52:36 +0200 |
|---|---|---|
| committer | Simen Heggestøyl | 2015-10-03 23:52:36 +0200 |
| commit | 6b66375133a54ea37106b00786d3a85f7c6d658d (patch) | |
| tree | c1430aec49e3610c6db7d6aa082988fbfc159b78 /lisp | |
| parent | 9a05f0ac953ce19395c7409aed6bdd8db83cebb0 (diff) | |
| download | emacs-6b66375133a54ea37106b00786d3a85f7c6d658d.tar.gz emacs-6b66375133a54ea37106b00786d3a85f7c6d658d.zip | |
Maintain ordering of JSON object keys by default
* lisp/json.el (json-object-type): Mention order handling in doc-string.
(json--plist-reverse): New utility function.
(json-read-object): Maintain ordering for alists and plists.
(json-pretty-print): Ensure that ordering is maintained.
* test/automated/json-tests.el (test-json-plist-reverse): New test for
`json--plist-reverse'.
(json-read-simple-alist): Update test to accommodate for changes in
`json-read-object'.
* etc/NEWS: Document the new behavior of the pretty printing functions.
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/json.el | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lisp/json.el b/lisp/json.el index daa0c94da28..e2c7cc77222 100644 --- a/lisp/json.el +++ b/lisp/json.el | |||
| @@ -57,7 +57,8 @@ | |||
| 57 | (defvar json-object-type 'alist | 57 | (defvar json-object-type 'alist |
| 58 | "Type to convert JSON objects to. | 58 | "Type to convert JSON objects to. |
| 59 | Must be one of `alist', `plist', or `hash-table'. Consider let-binding | 59 | Must be one of `alist', `plist', or `hash-table'. Consider let-binding |
| 60 | this around your call to `json-read' instead of `setq'ing it.") | 60 | this around your call to `json-read' instead of `setq'ing it. Ordering |
| 61 | is maintained for `alist' and `plist', but not for `hash-table'.") | ||
| 61 | 62 | ||
| 62 | (defvar json-array-type 'vector | 63 | (defvar json-array-type 'vector |
| 63 | "Type to convert JSON arrays to. | 64 | "Type to convert JSON arrays to. |
| @@ -136,6 +137,17 @@ without indentation.") | |||
| 136 | 'not-plist))) | 137 | 'not-plist))) |
| 137 | (null list)) | 138 | (null list)) |
| 138 | 139 | ||
| 140 | (defun json--plist-reverse (plist) | ||
| 141 | "Return a copy of PLIST in reverse order. | ||
| 142 | Unlike `reverse', this keeps the property-value pairs intact." | ||
| 143 | (let (res) | ||
| 144 | (while plist | ||
| 145 | (let ((prop (pop plist)) | ||
| 146 | (val (pop plist))) | ||
| 147 | (push val res) | ||
| 148 | (push prop res))) | ||
| 149 | res)) | ||
| 150 | |||
| 139 | (defmacro json--with-indentation (body) | 151 | (defmacro json--with-indentation (body) |
| 140 | `(let ((json--encoding-current-indentation | 152 | `(let ((json--encoding-current-indentation |
| 141 | (if json-encoding-pretty-print | 153 | (if json-encoding-pretty-print |
| @@ -400,7 +412,10 @@ Please see the documentation of `json-object-type' and `json-key-type'." | |||
| 400 | (signal 'json-object-format (list "," (json-peek)))))) | 412 | (signal 'json-object-format (list "," (json-peek)))))) |
| 401 | ;; Skip over the "}" | 413 | ;; Skip over the "}" |
| 402 | (json-advance) | 414 | (json-advance) |
| 403 | elements)) | 415 | (pcase json-object-type |
| 416 | (`alist (nreverse elements)) | ||
| 417 | (`plist (json--plist-reverse elements)) | ||
| 418 | (_ elements)))) | ||
| 404 | 419 | ||
| 405 | ;; Hash table encoding | 420 | ;; Hash table encoding |
| 406 | 421 | ||
| @@ -602,6 +617,8 @@ Advances point just past JSON object." | |||
| 602 | (interactive "r") | 617 | (interactive "r") |
| 603 | (atomic-change-group | 618 | (atomic-change-group |
| 604 | (let ((json-encoding-pretty-print t) | 619 | (let ((json-encoding-pretty-print t) |
| 620 | ;; Ensure that ordering is maintained | ||
| 621 | (json-object-type 'alist) | ||
| 605 | (txt (delete-and-extract-region begin end))) | 622 | (txt (delete-and-extract-region begin end))) |
| 606 | (insert (json-encode (json-read-from-string txt)))))) | 623 | (insert (json-encode (json-read-from-string txt)))))) |
| 607 | 624 | ||