diff options
-rw-r--r-- | images/Conversions.png | bin | 27833 -> 29455 bytes | |||
-rw-r--r-- | images/Conversions.xml | 2 | ||||
-rw-r--r-- | src/main/scala/spray/json/JsValue.scala | 1 | ||||
-rw-r--r-- | src/main/scala/spray/json/PrettyPrinter.scala | 4 | ||||
-rw-r--r-- | src/main/scala/spray/json/SortedPrinter.scala | 9 | ||||
-rw-r--r-- | src/test/scala/spray/json/SortedPrinterSpec.scala | 50 |
6 files changed, 64 insertions, 2 deletions
diff --git a/images/Conversions.png b/images/Conversions.png Binary files differindex fd73b1a..11d176f 100644 --- a/images/Conversions.png +++ b/images/Conversions.png 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 + } + } + } + +} |