summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--images/Conversions.pngbin27833 -> 29455 bytes
-rw-r--r--images/Conversions.xml2
-rw-r--r--src/main/scala/spray/json/JsValue.scala1
-rw-r--r--src/main/scala/spray/json/PrettyPrinter.scala4
-rw-r--r--src/main/scala/spray/json/SortedPrinter.scala9
-rw-r--r--src/test/scala/spray/json/SortedPrinterSpec.scala50
6 files changed, 64 insertions, 2 deletions
diff --git a/images/Conversions.png b/images/Conversions.png
index fd73b1a..11d176f 100644
--- a/images/Conversions.png
+++ b/images/Conversions.png
Binary files differ
diff --git a/images/Conversions.xml b/images/Conversions.xml
index ab0bed1..58d460e 100644
--- a/images/Conversions.xml
+++ b/images/Conversions.xml
@@ -1 +1 @@
-<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36"><diagram>5VlZk9o4EP41VE0eSPnAGB6HOZKidpOpYmqPR2EL8I5tsbKYgf31acktLFt2WMKRmsoLWG2p1f119+eW3fPvsu0nTtar31lM057nxNuef9/zvJHjwK8U7BqCJU/iUuSiYJPEtKiJBGOpSNZ1YcTynEaiJluwtK5sTZbUEswiktrSP5NYrNA4b1jJP9NkudLbuMNxeacQO60jpguySUVfieCevJ0RrUu56T8ANJwxUCOvsu0dTSU82vUSi8eOu3sjOc3RkO8vCIZDEo1dJ1iEY88djPquX6p4JekGrbbceFslgs7WJJLjNwgiLqFcUIxiiyFKhFZ8oiyjgu9gCi7wnUG5BKPuuqNy/FaB7Y4xE1YG0CO0j2DMl3vVldtwgZ63o4AqDJ+nxR9qIMPrb0nPn9xMZ1+/wKTb2fMHCxHONnlMpTYXptr4+JMFy8UMF8g5apz8p4YDGBeCs5d9ZiEWpyEaoFsaUcxUA9Ax7lPDE2Wn4Gnn0EzwJF+2wBmz6H3AOQ4Poomic6Opra/QXHMqxO4JIBUGpBHLACSB4gakNI9vOWdvMIpSUhRJBCvoNhF/gcTB67/l9ccwkMMcrJT3JLpqULsZPybS3lbs67FRhtDYItcG7mAs23AV4qogBeFLirNUTtnR4TQlInmtaz8F7cBGm/CCTguWHweqAm4PKug1QFWAV6DizQuDilVpgqpwvgKoWBkGqDswzMhd+aAlxljs1vBkfw+8EIzwOX99mkVGMlCFTkc688x6weS5F5RP78MZW8u8H83f69CAQveEjMWlT0yRpA7iACw2g+g5GEWtorQKV5n9VEPRcFBXFDT0lK5YelSk9+78r+Bje2QEX7AjSKo15Mc+By4QcsTrnCTVHqmwEam+Hh8b8iBsKHL9hqbzBd1u120OsBJgCbTZ3aLj4YjM9XTssY9gwBCDphlQqzBbd21XjQNx3kmPawsRu1060wGmA3wbl5rfbUeWi/iNFtf8Hqaw5aRYE6AFA4Dhvxt5wFT12i9UAd/CBHewBu8ncDUn0YtMmzzuRyxlvLzPl/MbL4AGCaxzzIsPapXWCldL/Ffby13kibuEu5r3maavVCSRfO43lj5RDlR2U914iM1Jd94ADg2ldgCq3KC+KYhLt7W4kQIQaClfiUyTIEyP5BnFv5fUhqNnBl3Ffd+VzNjWbzDImUWqyHWVxDHN0d9HkiWprIffNlESg4fOHcsLBrufNdNQRf2gh5RwKAsD7AfPm4XYDP1MPgobDVkbHQ2uVpb2u4WL0ZHy+/t05KOii/vdlgcH2Ojnkc4R1NiyXyWxr8K9QXN53NFLSCbJI58X8g/U2yKtISeZfAul9UljOjjxxI3k609zH/nawVIYGgh1XP1CpNxRb5qGPuKrBE3LelyrR09LzYoM99LzchEWektRXrFcrkAC0+Lr/B94iMgG4odqoj1bO2rSc/p7FTjTmRblG8+OFga6l/PWa9tMS9Rm5pdNNqf8xmioKnu6e6z3VLeHvjs03uvq161mlY5wTq1Gj2+fYFh92SlPf9UXMP/hGw==</diagram></mxfile>
+<mxfile userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36" type="device"><diagram>3Vndc9o4EP9rmEkf6PgDY3gMadIOc9dmhsx9PApbgK+2xckigfvru7JWWLLMUQKh13sBaSWtdn/7oZXcC++K7UdO1qtfWUrzXuCl2174oRcE8XgAv5KwU4RBOFaEJc9SRfIbwiz7hyLRQ+omS2llTRSM5SJb28SElSVNhEVbsNzeYk2Wmn1DmCUkd6m/Z6lYKeooGDb0TzRbrvQ2/hCVqcRO80jpgmxy0a9JMCaHC6J51VqF9wAYZwzYyFaxvaO5BE0DolR/ODC6F5LTEgX59wXRcEiSse9Fi3gc+INR3w8Vi2eSb1BqR42XVSbobE0S2X8B07q7oiDPlAuK5q5JKMVHygoq+A6m4GjooTOgL/j+SPVfGrD9MRp+ZQA9QvkI2ny5Z92oDQ3UvBsFZGHoPK1+qzvSvOGW9MLJzXT25TNMup09vXMQ4WxTplRy82Gqi084WbBSzHCBnFP3lUf7A+hXgrOve89CLM5DNEK1NKLoqQagOgAtPJF2Dp6uD80Ez8plB5wpS34OOMfxUTSRdGk0kYWB5ppTIXaPAKkwIK0Y6JK2qQkrADqB5BbQtExvOWcv0EtyUlVZAivoNhN/AMXD9p+y/T6OZLcE2eWYxLzuWIPpQya16LSIbbFD9qjYhtd2bqJSEL6kOAsdi6ZWrnZtxmlORPZsp+5zbBC5NiC8otOKlaeBWgO3BxX4GqDWgDeg4uBlQUUETVAR5+uDivFigLoDSQ3flccvMfpit4bz/mfIFtEIT//rJ1/MUwaqUP9IyZ9YL5o89SJ1ph/3WMvzXuu/b5IGEMzLeSwufWR1ktRGHIDEphEDDzfWLJSYuMqsslqMhgObUdTio3Rz+NSW3qvzXcbHoskwvmAnJKlOk596DpxvcoTnTZNUt6XilqX6un+qyaO4xcgPW5wuZ3S3iHdzgOMAS0ibJxTu+1sUmWsOzX2lMwPGaEWdAfEmYhX0Wi4rB+K8s45rBxG3iHrNteYw0sdPBkvvrovMm+it7WnqPcxhy0m1JpAWDACGf2/ktbOO135VB/AtTPAHa1BsAq05Sb5KtynTfsJyxtU4X85vgggKJJDOMxvv6lWaK7SW+F9vL3eR93AFdzPvE82fqcgSee63lj5SDqnsphm4T81Jd8EArhKKOwClNrA3BbJSW5NbLgA2lPSVKHQShOmJvLmEH2Rqw94Tg6riQx/eIbrrDQbusMjr5LrK0pSWqO8DKbJcxsMvmyRLQUPvjpUVg90v6mk4al//cPkxL4ywQLysF2Ix9CPzUdwqyLrS0eBqYem+OFwmHWmgT0tHIUL65np3+cGRbPTjks4JqbFjv4bituK9QHN53dFLSCGTRzmv5B+wd0maQ0kK+Tal+UlhDuTEMzeSj6LmPvIxwmEYGwgdaP1fk/L3x5tOQ+/xKUGnZd234jHQVDMi4z31srkIA70jKK8YLldIAtPqy/wvODFkAfGqmOj21gMxGXj9PQuc6U0r9Q56oISB6uWy8do10yF1ifl5U8wpvzEKqkaewzXWfzZuX/E1ovXaqx9hzSgd4RwrRk8vn6DbfO9Rt7/ma1l4/w0=</diagram></mxfile> \ No newline at end of file
diff --git a/src/main/scala/spray/json/JsValue.scala b/src/main/scala/spray/json/JsValue.scala
index b21672d..a269475 100644
--- a/src/main/scala/spray/json/JsValue.scala
+++ b/src/main/scala/spray/json/JsValue.scala
@@ -28,6 +28,7 @@ sealed abstract class JsValue {
def toString(printer: (JsValue => String)) = printer(this)
def compactPrint = CompactPrinter(this)
def prettyPrint = PrettyPrinter(this)
+ def sortedPrint = SortedPrinter(this)
def convertTo[T :JsonReader]: T = jsonReader[T].read(this)
/**
diff --git a/src/main/scala/spray/json/PrettyPrinter.scala b/src/main/scala/spray/json/PrettyPrinter.scala
index 57cf35e..6af5443 100644
--- a/src/main/scala/spray/json/PrettyPrinter.scala
+++ b/src/main/scala/spray/json/PrettyPrinter.scala
@@ -37,9 +37,11 @@ trait PrettyPrinter extends JsonPrinter {
}
}
+ protected def organiseMembers(members: Map[String, JsValue]): Seq[(String, JsValue)] = members.toSeq
+
protected def printObject(members: Map[String, JsValue], sb: StringBuilder, indent: Int) {
sb.append("{\n")
- printSeq(members, sb.append(",\n")) { m =>
+ printSeq(organiseMembers(members), sb.append(",\n")) { m =>
printIndent(sb, indent + Indent)
printString(m._1, sb)
sb.append(": ")
diff --git a/src/main/scala/spray/json/SortedPrinter.scala b/src/main/scala/spray/json/SortedPrinter.scala
new file mode 100644
index 0000000..070d36c
--- /dev/null
+++ b/src/main/scala/spray/json/SortedPrinter.scala
@@ -0,0 +1,9 @@
+package spray.json
+
+trait SortedPrinter extends PrettyPrinter {
+
+ override protected def organiseMembers(members: Map[String, JsValue]): Seq[(String, JsValue)] =
+ members.toSeq.sortBy(_._1)
+}
+
+object SortedPrinter extends SortedPrinter
diff --git a/src/test/scala/spray/json/SortedPrinterSpec.scala b/src/test/scala/spray/json/SortedPrinterSpec.scala
new file mode 100644
index 0000000..0ea1045
--- /dev/null
+++ b/src/test/scala/spray/json/SortedPrinterSpec.scala
@@ -0,0 +1,50 @@
+package spray.json
+
+import scala.collection.immutable.ListMap
+import org.specs2.mutable._
+
+class SortedPrinterSpec extends Specification {
+
+ "The SortedPrinter" should {
+ "print a more complicated JsObject nicely aligned with fields sorted" in {
+ val obj = JsonParser {
+ """{
+ | "Unic\u00f8de" : "Long string with newline\nescape",
+ | "Boolean no": false,
+ | "number": -1.2323424E-5,
+ | "key with \"quotes\"" : "string",
+ | "key with spaces": null,
+ | "simpleKey" : "some value",
+ | "zero": 0,
+ | "sub object" : {
+ | "sub key": 26.5,
+ | "a": "b",
+ | "array": [1, 2, { "yes":1, "no":0 }, ["a", "b", null], false]
+ | },
+ | "Boolean yes":true
+ |}""".stripMargin
+ }
+ SortedPrinter(obj) mustEqual {
+ """{
+ | "Boolean no": false,
+ | "Boolean yes": true,
+ | "Unic\u00f8de": "Long string with newline\nescape",
+ | "key with \"quotes\"": "string",
+ | "key with spaces": null,
+ | "number": -0.000012323424,
+ | "simpleKey": "some value",
+ | "sub object": {
+ | "a": "b",
+ | "array": [1, 2, {
+ | "no": 0,
+ | "yes": 1
+ | }, ["a", "b", null], false],
+ | "sub key": 26.5
+ | },
+ | "zero": 0
+ |}""".stripMargin
+ }
+ }
+ }
+
+}