about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorKevin Cantu <me@kevincantu.org>2012-08-30 17:38:07 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2012-08-31 07:11:07 -0700
commit272c5ab0e9573e6e85a1d576a3c95b5213cf5c61 (patch)
treea16d718386ca608db206483a4e275e9a76dc2ed7 /src/libstd
parentd47cb101bf8627025345d17a5b0e9bfb6c2d01fa (diff)
Pretty print JSON: sorting object keys
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/json.rs25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/libstd/json.rs b/src/libstd/json.rs
index 5c70c1ff210..aa986a281a1 100644
--- a/src/libstd/json.rs
+++ b/src/libstd/json.rs
@@ -12,11 +12,14 @@ import io::WriterUtil;
 import map;
 import map::hashmap;
 import map::map;
+import sort;
 
 export Json;
 export Error;
 export to_writer;
+export to_writer_pretty;
 export to_str;
+export to_str_pretty;
 export from_reader;
 export from_str;
 export eq;
@@ -89,8 +92,8 @@ fn to_writer(wr: io::Writer, j: Json) {
 /// Serializes a json value into a io::writer
 fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
     fn spaces(n: uint) -> ~str {
-        let ss = ~"";
-        n.times { str::push_str(ss, " "); }
+        let mut ss = ~"";
+        for n.times { str::push_str(ss, " "); }
         return ss;
     }
 
@@ -98,7 +101,7 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
       Num(n) => wr.write_str(float::to_str(n, 6u)),
       String(s) => wr.write_str(escape_str(*s)),
       Boolean(b) => wr.write_str(if b { ~"true" } else { ~"false" }),
-      List(v) => {
+      List(vv) => {
         // [
         wr.write_str(spaces(indent));
         wr.write_str("[ ");
@@ -108,7 +111,7 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
         //   elem ]
         let inner_indent = indent + 2;
         let mut first = true;
-        for (*v).each |item| {
+        for (*vv).each |item| {
             if !first {
                 wr.write_str(~",\n");
                 wr.write_str(spaces(inner_indent));
@@ -120,7 +123,16 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
         // ]
         wr.write_str(~" ]");
       }
-      Dict(d) => {
+      Dict(dd) => {
+        // convert from a dictionary
+        let mut pairs = ~[];
+        for dd.each |key, value| {
+            vec::push(pairs, (key, value));
+        }
+
+        // sort by key strings
+        let sorted_pairs = sort::merge_sort(|a,b| *a <= *b, pairs);
+
         // {
         wr.write_str(spaces(indent));
         wr.write_str(~"{ ");
@@ -130,7 +142,8 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
         //   k: v }
         let inner_indent = indent + 2;
         let mut first = true;
-        for d.each |key, value| {
+        for sorted_pairs.each |kv| {
+            let (key, value) = kv;
             if !first {
                 wr.write_str(~",\n");
                 wr.write_str(spaces(inner_indent));