@@ -12,11 +12,14 @@ import io::WriterUtil;
12
12
import map;
13
13
import map:: hashmap;
14
14
import map:: map;
15
+ import sort;
15
16
16
17
export Json ;
17
18
export Error ;
18
19
export to_writer;
20
+ export to_writer_pretty;
19
21
export to_str;
22
+ export to_str_pretty;
20
23
export from_reader;
21
24
export from_str;
22
25
export eq;
@@ -89,16 +92,16 @@ fn to_writer(wr: io::Writer, j: Json) {
89
92
/// Serializes a json value into a io::writer
90
93
fn to_writer_pretty ( wr : io:: Writer , j : Json , indent : uint ) {
91
94
fn spaces ( n : uint ) -> ~str {
92
- let ss = ~"";
93
- n. times { str:: push_str ( ss, " " ) ; }
95
+ let mut ss = ~"";
96
+ for n. times { str : : push_str( ss, " " ) ; }
94
97
return ss;
95
98
}
96
99
97
100
match j {
98
101
Num ( n) => wr. write_str ( float:: to_str ( n, 6 u) ) ,
99
102
String ( s) => wr. write_str ( escape_str ( * s) ) ,
100
103
Boolean ( b) => wr. write_str ( if b { ~"true " } else { ~"false " } ) ,
101
- List ( v ) => {
104
+ List ( vv ) => {
102
105
// [
103
106
wr. write_str ( spaces ( indent) ) ;
104
107
wr. write_str ( "[ " ) ;
@@ -108,7 +111,7 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
108
111
// elem ]
109
112
let inner_indent = indent + 2 ;
110
113
let mut first = true ;
111
- for ( * v ) . each |item| {
114
+ for ( * vv ) . each |item| {
112
115
if !first {
113
116
wr. write_str ( ~", \n ") ;
114
117
wr. write_str ( spaces ( inner_indent) ) ;
@@ -120,7 +123,16 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
120
123
// ]
121
124
wr. write_str ( ~" ] ") ;
122
125
}
123
- Dict ( d) => {
126
+ Dict ( dd) => {
127
+ // convert from a dictionary
128
+ let mut pairs = ~[ ] ;
129
+ for dd. each |key, value| {
130
+ vec:: push( pairs, ( key, value) ) ;
131
+ }
132
+
133
+ // sort by key strings
134
+ let sorted_pairs = sort:: merge_sort( |a, b| * a < = * b , pairs) ;
135
+
124
136
// {
125
137
wr. write_str ( spaces ( indent ) ) ;
126
138
wr. write_str( ~"{ ");
@@ -130,7 +142,8 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
130
142
// k: v }
131
143
let inner_indent = indent + 2;
132
144
let mut first = true;
133
- for d.each |key, value| {
145
+ for sorted_pairs.each |kv| {
146
+ let (key, value) = kv;
134
147
if !first {
135
148
wr.write_str(~" , \n ") ;
136
149
wr. write_str ( spaces ( inner_indent) ) ;
0 commit comments