diff options
| author | Kevin Cantu <me@kevincantu.org> | 2012-08-30 17:38:07 -0700 |
|---|---|---|
| committer | Erick Tryzelaar <erick.tryzelaar@gmail.com> | 2012-08-31 07:11:07 -0700 |
| commit | 272c5ab0e9573e6e85a1d576a3c95b5213cf5c61 (patch) | |
| tree | a16d718386ca608db206483a4e275e9a76dc2ed7 /src/libstd | |
| parent | d47cb101bf8627025345d17a5b0e9bfb6c2d01fa (diff) | |
Pretty print JSON: sorting object keys
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/json.rs | 25 |
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)); |
