From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Simen =?UTF-8?Q?Heggest=C3=B8yl?= Newsgroups: gmane.emacs.bugs Subject: bug#21488: json-pretty-print-buffer works,but... Date: Sat, 03 Oct 2015 15:42:25 +0200 Message-ID: <87r3lcf4qm.fsf@gmail.com> References: <55F840B1.87A9B6.02747@m50-133.163.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1443879803 25398 80.91.229.3 (3 Oct 2015 13:43:23 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 3 Oct 2015 13:43:23 +0000 (UTC) Cc: Junqi Cai , 21488@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Oct 03 15:43:12 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1ZiN5j-00033G-Cn for geb-bug-gnu-emacs@m.gmane.org; Sat, 03 Oct 2015 15:43:11 +0200 Original-Received: from localhost ([::1]:38685 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZiN5i-00054e-LM for geb-bug-gnu-emacs@m.gmane.org; Sat, 03 Oct 2015 09:43:10 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:43411) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZiN5e-00051t-2L for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2015 09:43:07 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZiN5a-0005Vv-Rm for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2015 09:43:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:35793) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZiN5a-0005Vr-Nc for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2015 09:43:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1ZiN5a-0002oq-Eb for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2015 09:43:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Simen =?UTF-8?Q?Heggest=C3=B8yl?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 03 Oct 2015 13:43:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 21488 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 21488-submit@debbugs.gnu.org id=B21488.144387975210797 (code B ref 21488); Sat, 03 Oct 2015 13:43:02 +0000 Original-Received: (at 21488) by debbugs.gnu.org; 3 Oct 2015 13:42:32 +0000 Original-Received: from localhost ([127.0.0.1]:52995 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZiN55-0002o4-5G for submit@debbugs.gnu.org; Sat, 03 Oct 2015 09:42:31 -0400 Original-Received: from mail-lb0-f176.google.com ([209.85.217.176]:34045) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZiN52-0002nv-37 for 21488@debbugs.gnu.org; Sat, 03 Oct 2015 09:42:28 -0400 Original-Received: by lbbwt4 with SMTP id wt4so998164lbb.1 for <21488@debbugs.gnu.org>; Sat, 03 Oct 2015 06:42:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-type; bh=obeDdDdeUqA/krLCE7yahR/nffYrjq9WEAiqnDQFCbA=; b=iwM2awYVGLH0LYXhO19aHtyQOk9gCow+h6rIMX/74zZ20Ie8TEUTQUFvnoRM+DDJ2e nQNzh7VKekDGUu+T2MziBFeL6Q4ATTo0HxoqXXzhrDgJd/mX1EF9qYSat7jycTXvb7Qm 2wN7dKsorSmRrjLFKGTe/PXK0ilfksaRmIQRY4m/cxDU4pAV0nnie9QHkEnJoLp/i2d6 pVWQSkZeepQOI2ToomE4iIzDWyytyUfiM1U3Ek48w63U+1wgez8C6d31VJgX3rzdXB/D YiaAny4qBWTCYXVTQ+/FpZWhTuTk6znq+n1ARTDeUZznvmshUgrj4Iaer4iglybET5Xr SW0w== X-Received: by 10.25.143.73 with SMTP id r70mr5022017lfd.108.1443879747125; Sat, 03 Oct 2015 06:42:27 -0700 (PDT) Original-Received: from x240 (cm-84.210.143.4.getinternet.no. [84.210.143.4]) by smtp.gmail.com with ESMTPSA id rb2sm2392574lbb.20.2015.10.03.06.42.26 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 03 Oct 2015 06:42:26 -0700 (PDT) In-Reply-To: (Stefan Monnier's message of "Tue, 15 Sep 2015 21:13:47 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:107269 Archived-At: Stefan Monnier writes: >> See https://github.com/pashky/restclient.el/issues/97 > > Please include a description of the problem right here, so it's archived > here and is available no matter what github turns into. > > > Stefan The reporter's concern seems to be that `json-pretty-print' and `json-pretty-print-buffer' reverse the order of JSON object keys. So for instance, when you pretty print the following object: { "a": 1, "b": 2 } It becomes: { "b": 2, "a": 1 } JSON objects are by definition unordered, but I agree that it would be nicer if the prettification functions maintained the ordering by default. Please consider the following patch, which makes the prettification functions maintain the original ordering: >From f994203f746df3aa9fcf10592fd03d7aabe1f4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simen=20Heggest=C3=B8yl?= Date: Sat, 3 Oct 2015 11:31:16 +0200 Subject: [PATCH] Maintain ordering of JSON object keys by default * lisp/json.el (json-object-type): Mention order handling in doc-string. (json-read-object): Maintain ordering for alists. (json-pretty-print): Ensure that ordering is maintained. * test/automated/json-tests.el (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. --- etc/NEWS | 5 +++++ lisp/json.el | 9 +++++++-- test/automated/json-tests.el | 7 ++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 26c478e..dbe0de3 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -314,6 +314,11 @@ standards. * Changes in Specialized Modes and Packages in Emacs 25.1 +** JSON +--- +*** `json-pretty-print' and `json-pretty-print-buffer' now maintain +the ordering of object keys by default. + ** You can recompute the VC state of a file buffer with `M-x vc-refresh-state' ** Prog mode has some support for multi-mode indentation. See `prog-indentation-context' and `prog-widen'. diff --git a/lisp/json.el b/lisp/json.el index daa0c94..b0c7e9e 100644 --- a/lisp/json.el +++ b/lisp/json.el @@ -57,7 +57,8 @@ (defvar json-object-type 'alist "Type to convert JSON objects to. Must be one of `alist', `plist', or `hash-table'. Consider let-binding -this around your call to `json-read' instead of `setq'ing it.") +this around your call to `json-read' instead of `setq'ing it. Ordering +is maintained only for `alist'.") (defvar json-array-type 'vector "Type to convert JSON arrays to. @@ -400,7 +401,9 @@ Please see the documentation of `json-object-type' and `json-key-type'." (signal 'json-object-format (list "," (json-peek)))))) ;; Skip over the "}" (json-advance) - elements)) + (if (eq json-object-type 'alist) + (nreverse elements) + elements))) ;; Hash table encoding @@ -602,6 +605,8 @@ Advances point just past JSON object." (interactive "r") (atomic-change-group (let ((json-encoding-pretty-print t) + ;; Ensure that ordering is maintained + (json-object-type 'alist) (txt (delete-and-extract-region begin end))) (insert (json-encode (json-read-from-string txt)))))) diff --git a/test/automated/json-tests.el b/test/automated/json-tests.el index fd89b7a..c5a9c6c 100644 --- a/test/automated/json-tests.el +++ b/test/automated/json-tests.el @@ -28,9 +28,10 @@ "{\"a\":1,\"b\":2}"))) (ert-deftest json-read-simple-alist () - (should (equal (json-read-from-string "{\"a\": 1, \"b\": 2}") - '((b . 2) - (a . 1))))) + (let ((json-object-type 'alist)) + (should (equal (json-read-from-string "{\"a\": 1, \"b\": 2}") + '((a . 1) + (b . 2)))))) (ert-deftest json-encode-string-with-special-chars () (should (equal (json-encode-string "a\n\fb") -- 2.5.3