json.rs 84.3 KB
Newer Older
1
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
2 3 4 5 6 7 8 9 10
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

E
Elly Jones 已提交
11 12
// Rust JSON serialization library
// Copyright (c) 2011 Google Inc.
13

14 15
#![forbid(non_camel_case_types)]
#![allow(missing_doc)]
E
Elly Jones 已提交
16

M
musitdev 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*!
JSON parsing and serialization

# What is JSON?

JSON (JavaScript Object Notation) is a way to write data in Javascript.
Like XML it allows one to encode structured data in a text format that can be read by humans easily.
Its native compatibility with JavaScript and its simple syntax make it used widely.

Json data are encoded in a form of "key":"value".
Data types that can be encoded are JavaScript types :
boolean (`true` or `false`), number (`f64`), string, array, object, null.
An object is a series of string keys mapping to values, in `"key": value` format.
Arrays are enclosed in square brackets ([ ... ]) and objects in curly brackets ({ ... }).
A simple JSON document encoding a person, his/her age, address and phone numbers could look like:

A
Alex Crichton 已提交
33
```ignore
M
musitdev 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 43,
    "Address": {
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    },
    "PhoneNumbers": [
        "+44 1234567",
        "+44 2345678"
    ]
}
```

# Rust Type-based Encoding and Decoding

Rust provides a mechanism for low boilerplate encoding & decoding
of values to and from JSON via the serialization API.
54 55
To be able to encode a piece of data, it must implement the `serialize::Encodable` trait.
To be able to decode a piece of data, it must implement the `serialize::Decodable` trait.
M
musitdev 已提交
56 57 58 59 60 61 62
The Rust compiler provides an annotation to automatically generate
the code for these traits: `#[deriving(Decodable, Encodable)]`

To encode using Encodable :

```rust
use std::io;
A
Alex Crichton 已提交
63
use serialize::{json, Encodable};
M
musitdev 已提交
64 65 66 67 68 69 70

 #[deriving(Encodable)]
 pub struct TestStruct   {
    data_str: ~str,
 }

fn main() {
71
    let to_encode_object = TestStruct{data_str:"example of string to encode".to_owned()};
72
    let mut m = io::MemWriter::new();
M
musitdev 已提交
73 74
    {
        let mut encoder = json::Encoder::new(&mut m as &mut std::io::Writer);
S
Sean McArthur 已提交
75 76 77 78
        match to_encode_object.encode(&mut encoder) {
            Ok(()) => (),
            Err(e) => fail!("json encoding error: {}", e)
        };
M
musitdev 已提交
79 80 81 82 83 84 85 86
    }
}
```

Two wrapper functions are provided to encode a Encodable object
into a string (~str) or buffer (~[u8]): `str_encode(&m)` and `buffer_encode(&m)`.

```rust
A
Alex Crichton 已提交
87
use serialize::json;
88
let to_encode_object = "example of string to encode".to_owned();
M
musitdev 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101
let encoded_str: ~str = json::Encoder::str_encode(&to_encode_object);
```

JSON API provide an enum `json::Json` and a trait `ToJson` to encode object.
The trait `ToJson` encode object into a container `json::Json` and the API provide writer
to encode them into a stream or a string ...

When using `ToJson` the `Encodable` trait implementation is not mandatory.

A basic `ToJson` example using a TreeMap of attribute name / attribute value:


```rust
A
Alex Crichton 已提交
102
extern crate collections;
A
Alex Crichton 已提交
103
extern crate serialize;
104

A
Alex Crichton 已提交
105 106
use serialize::json;
use serialize::json::ToJson;
107
use collections::TreeMap;
M
musitdev 已提交
108 109 110 111 112 113 114 115 116

pub struct MyStruct  {
    attr1: u8,
    attr2: ~str,
}

impl ToJson for MyStruct {
    fn to_json( &self ) -> json::Json {
        let mut d = ~TreeMap::new();
117 118
        d.insert("attr1".to_owned(), self.attr1.to_json());
        d.insert("attr2".to_owned(), self.attr2.to_json());
M
musitdev 已提交
119 120 121 122 123
        json::Object(d)
    }
}

fn main() {
124
    let test2: MyStruct = MyStruct {attr1: 1, attr2:"test".to_owned()};
M
musitdev 已提交
125 126 127 128 129
    let tjson: json::Json = test2.to_json();
    let json_str: ~str = tjson.to_str();
}
```

H
Huon Wilson 已提交
130
To decode a JSON string using `Decodable` trait :
M
musitdev 已提交
131 132

```rust
A
Alex Crichton 已提交
133
extern crate serialize;
A
Alex Crichton 已提交
134
use serialize::{json, Decodable};
M
musitdev 已提交
135 136 137 138 139 140 141 142 143

#[deriving(Decodable)]
pub struct MyStruct  {
     attr1: u8,
     attr2: ~str,
}

fn main() {
    let json_str_to_decode: ~str =
144
            "{\"attr1\":1,\"attr2\":\"toto\"}".to_owned();
A
Alex Crichton 已提交
145 146
    let json_object = json::from_str(json_str_to_decode);
    let mut decoder = json::Decoder::new(json_object.unwrap());
S
Sean McArthur 已提交
147 148 149 150
    let decoded_object: MyStruct = match Decodable::decode(&mut decoder) {
        Ok(v) => v,
        Err(e) => fail!("Decoding error: {}", e)
    }; // create the final object
M
musitdev 已提交
151 152 153 154 155 156 157 158 159 160 161
}
```

# Examples of use

## Using Autoserialization

Create a struct called TestStruct1 and serialize and deserialize it to and from JSON
using the serialization API, using the derived serialization code.

```rust
A
Alex Crichton 已提交
162
extern crate serialize;
A
Alex Crichton 已提交
163
use serialize::{json, Encodable, Decodable};
M
musitdev 已提交
164 165 166 167 168 169 170 171 172 173 174 175

 #[deriving(Decodable, Encodable)] //generate Decodable, Encodable impl.
 pub struct TestStruct1  {
    data_int: u8,
    data_str: ~str,
    data_vector: ~[u8],
 }

// To serialize use the `json::str_encode` to encode an object in a string.
// It calls the generated `Encodable` impl.
fn main() {
    let to_encode_object = TestStruct1
176
         {data_int: 1, data_str:"toto".to_owned(), data_vector:~[2,3,4,5]};
M
musitdev 已提交
177 178
    let encoded_str: ~str = json::Encoder::str_encode(&to_encode_object);

A
Alex Crichton 已提交
179
    // To deserialize use the `json::from_str` and `json::Decoder`
M
musitdev 已提交
180

A
Alex Crichton 已提交
181
    let json_object = json::from_str(encoded_str);
M
musitdev 已提交
182
    let mut decoder = json::Decoder::new(json_object.unwrap());
S
Sean McArthur 已提交
183
    let decoded1: TestStruct1 = Decodable::decode(&mut decoder).unwrap(); // create the final object
M
musitdev 已提交
184 185 186 187 188
}
```

## Using `ToJson`

H
Huon Wilson 已提交
189
This example use the ToJson impl to deserialize the JSON string.
M
musitdev 已提交
190 191 192
Example of `ToJson` trait implementation for TestStruct1.

```rust
A
Alex Crichton 已提交
193 194
extern crate serialize;
extern crate collections;
195

A
Alex Crichton 已提交
196 197
use serialize::json::ToJson;
use serialize::{json, Encodable, Decodable};
198
use collections::TreeMap;
M
musitdev 已提交
199 200 201 202 203 204 205 206 207 208 209

#[deriving(Decodable, Encodable)] // generate Decodable, Encodable impl.
pub struct TestStruct1  {
    data_int: u8,
    data_str: ~str,
    data_vector: ~[u8],
}

impl ToJson for TestStruct1 {
    fn to_json( &self ) -> json::Json {
        let mut d = ~TreeMap::new();
210 211 212
        d.insert("data_int".to_owned(), self.data_int.to_json());
        d.insert("data_str".to_owned(), self.data_str.to_json());
        d.insert("data_vector".to_owned(), self.data_vector.to_json());
M
musitdev 已提交
213 214 215 216 217
        json::Object(d)
    }
}

fn main() {
H
Huon Wilson 已提交
218
    // Serialization using our impl of to_json
M
musitdev 已提交
219

220 221
    let test2: TestStruct1 = TestStruct1 {data_int: 1, data_str:"toto".to_owned(),
                                          data_vector:~[2,3,4,5]};
M
musitdev 已提交
222 223 224
    let tjson: json::Json = test2.to_json();
    let json_str: ~str = tjson.to_str();

H
Huon Wilson 已提交
225
    // Deserialize like before.
M
musitdev 已提交
226 227 228

    let mut decoder = json::Decoder::new(json::from_str(json_str).unwrap());
    // create the final object
S
Sean McArthur 已提交
229
    let decoded2: TestStruct1 = Decodable::decode(&mut decoder).unwrap();
M
musitdev 已提交
230 231 232 233
}
```

*/
B
Brian Anderson 已提交
234

235
use collections::HashMap;
236
use std::char;
D
Daniel Micay 已提交
237
use std::f64;
238
use std::fmt;
A
Alex Crichton 已提交
239
use std::io::MemWriter;
240
use std::io;
D
Daniel Micay 已提交
241
use std::num;
242
use std::str;
243
use std::str::ScalarValue;
244
use std::strbuf::StrBuf;
245

A
Alex Crichton 已提交
246
use Encodable;
247
use collections::TreeMap;
E
Elly Jones 已提交
248

249
/// Represents a json value
250
#[deriving(Clone, Eq)]
251
pub enum Json {
D
Daniel Micay 已提交
252
    Number(f64),
253
    String(~str),
B
Ben Striegel 已提交
254
    Boolean(bool),
255 256
    List(List),
    Object(~Object),
B
Ben Striegel 已提交
257
    Null,
E
Elly Jones 已提交
258 259
}

260
pub type List = ~[Json];
261
pub type Object = TreeMap<~str, Json>;
262

S
Sean McArthur 已提交
263 264 265 266 267 268 269 270
#[deriving(Eq, Show)]
pub enum Error {
    /// msg, line, col
    ParseError(~str, uint, uint),
    ExpectedError(~str, ~str),
    MissingFieldError(~str),
    UnknownVariantError(~str),
    IoError(io::IoError)
271
}
272

S
Sean McArthur 已提交
273 274
pub type EncodeResult = io::IoResult<()>;
pub type DecodeResult<T> = Result<T, Error>;
A
Alex Crichton 已提交
275

276
fn escape_str(s: &str) -> ~str {
277
    let mut escaped = StrBuf::from_str("\"");
278
    for c in s.chars() {
279
        match c {
280 281 282 283 284 285 286 287
          '"' => escaped.push_str("\\\""),
          '\\' => escaped.push_str("\\\\"),
          '\x08' => escaped.push_str("\\b"),
          '\x0c' => escaped.push_str("\\f"),
          '\n' => escaped.push_str("\\n"),
          '\r' => escaped.push_str("\\r"),
          '\t' => escaped.push_str("\\t"),
          _ => escaped.push_char(c),
E
Elly Jones 已提交
288
        }
289
    };
290
    escaped.push_char('"');
291
    escaped.into_owned()
E
Elly Jones 已提交
292 293
}

294
fn spaces(n: uint) -> ~str {
295 296 297 298 299
    let mut ss = StrBuf::new();
    for _ in range(0, n) {
        ss.push_str(" ");
    }
    return ss.into_owned();
300 301
}

302
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
303
pub struct Encoder<'a> {
304
    wr: &'a mut io::Writer,
305 306
}

E
Erik Price 已提交
307
impl<'a> Encoder<'a> {
308 309
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
310
    pub fn new<'a>(wr: &'a mut io::Writer) -> Encoder<'a> {
S
Sean McArthur 已提交
311
        Encoder { wr: wr }
312
    }
M
musitdev 已提交
313 314

    /// Encode the specified struct into a json [u8]
S
Steven Fackler 已提交
315
    pub fn buffer_encode<T:Encodable<Encoder<'a>, io::IoError>>(to_encode_object: &T) -> Vec<u8>  {
M
musitdev 已提交
316 317 318 319
       //Serialize the object in a string using a writer
        let mut m = MemWriter::new();
        {
            let mut encoder = Encoder::new(&mut m as &mut io::Writer);
S
Sean McArthur 已提交
320 321
            // MemWriter never Errs
            let _ = to_encode_object.encode(&mut encoder);
M
musitdev 已提交
322
        }
323
        m.unwrap()
M
musitdev 已提交
324 325 326
    }

    /// Encode the specified struct into a json str
S
Sean McArthur 已提交
327
    pub fn str_encode<T:Encodable<Encoder<'a>, io::IoError>>(to_encode_object: &T) -> ~str  {
S
Steven Fackler 已提交
328 329
        let buff = Encoder::buffer_encode(to_encode_object);
        str::from_utf8(buff.as_slice()).unwrap().to_owned()
M
musitdev 已提交
330
    }
331 332
}

S
Sean McArthur 已提交
333 334
impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
    fn emit_nil(&mut self) -> EncodeResult { write!(self.wr, "null") }
335

S
Sean McArthur 已提交
336 337 338 339 340
    fn emit_uint(&mut self, v: uint) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult  { self.emit_f64(v as f64) }
341

S
Sean McArthur 已提交
342 343 344 345 346
    fn emit_int(&mut self, v: int) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult  { self.emit_f64(v as f64) }
347

S
Sean McArthur 已提交
348
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
349
        if v {
S
Sean McArthur 已提交
350
            write!(self.wr, "true")
351
        } else {
S
Sean McArthur 已提交
352
            write!(self.wr, "false")
353 354 355
        }
    }

S
Sean McArthur 已提交
356 357
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
        write!(self.wr, "{}", f64::to_str_digits(v, 6u))
A
Alex Crichton 已提交
358
    }
S
Sean McArthur 已提交
359
    fn emit_f32(&mut self, v: f32) -> EncodeResult { self.emit_f64(v as f64) }
360

S
Sean McArthur 已提交
361 362 363
    fn emit_char(&mut self, v: char) -> EncodeResult { self.emit_str(str::from_char(v)) }
    fn emit_str(&mut self, v: &str) -> EncodeResult {
        write!(self.wr, "{}", escape_str(v))
A
Alex Crichton 已提交
364
    }
365

S
Sean McArthur 已提交
366 367 368
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { f(self) }
369 370 371 372 373

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _id: uint,
                         cnt: uint,
S
Sean McArthur 已提交
374
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
375
        // enums are encoded as strings or objects
376
        // Bunny => "Bunny"
377
        // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
378
        if cnt == 0 {
S
Sean McArthur 已提交
379
            write!(self.wr, "{}", escape_str(name))
380
        } else {
A
Alex Crichton 已提交
381 382 383
            try!(write!(self.wr, "\\{\"variant\":"));
            try!(write!(self.wr, "{}", escape_str(name)));
            try!(write!(self.wr, ",\"fields\":["));
S
Sean McArthur 已提交
384 385
            try!(f(self));
            write!(self.wr, "]\\}")
386 387 388
        }
    }

S
Sean McArthur 已提交
389 390 391
    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
392
        if idx != 0 {
A
Alex Crichton 已提交
393
            try!(write!(self.wr, ","));
394
        }
S
Sean McArthur 已提交
395
        f(self)
396 397 398 399 400 401
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
402
                                f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
403 404 405 406 407 408
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
409
                                      f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
410 411 412
        self.emit_enum_variant_arg(idx, f)
    }

S
Sean McArthur 已提交
413 414 415 416
    fn emit_struct(&mut self,
                   _: &str,
                   _: uint,
                   f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
417
        try!(write!(self.wr, r"\{"));
S
Sean McArthur 已提交
418 419
        try!(f(self));
        write!(self.wr, r"\}")
420 421 422 423 424
    }

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
425 426
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        if idx != 0 { try!(write!(self.wr, ",")); }
A
Alex Crichton 已提交
427
        try!(write!(self.wr, "{}:", escape_str(name)));
S
Sean McArthur 已提交
428
        f(self)
429 430
    }

S
Sean McArthur 已提交
431
    fn emit_tuple(&mut self, len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
432 433
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
434 435 436
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
437 438 439 440 441 442
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _name: &str,
                         len: uint,
S
Sean McArthur 已提交
443
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
444 445
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
446 447 448
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
449 450 451
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
452 453 454 455 456 457 458
    fn emit_option(&mut self, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
    fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() }
    fn emit_option_some(&mut self, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
459

S
Sean McArthur 已提交
460
    fn emit_seq(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
461
        try!(write!(self.wr, "["));
S
Sean McArthur 已提交
462 463
        try!(f(self));
        write!(self.wr, "]")
464 465
    }

S
Sean McArthur 已提交
466
    fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
467
        if idx != 0 {
A
Alex Crichton 已提交
468
            try!(write!(self.wr, ","));
469 470 471 472
        }
        f(self)
    }

S
Sean McArthur 已提交
473
    fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
474
        try!(write!(self.wr, r"\{"));
S
Sean McArthur 已提交
475 476
        try!(f(self));
        write!(self.wr, r"\}")
477 478
    }

S
Sean McArthur 已提交
479 480 481
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
482
        use std::str::from_utf8;
A
Alex Crichton 已提交
483
        if idx != 0 { try!(write!(self.wr, ",")) }
484 485 486 487
        // ref #12967, make sure to wrap a key in double quotes,
        // in the event that its of a type that omits them (eg numbers)
        let mut buf = MemWriter::new();
        let mut check_encoder = Encoder::new(&mut buf);
S
Sean McArthur 已提交
488
        try!(f(&mut check_encoder));
489
        let buf = buf.unwrap();
S
Steven Fackler 已提交
490
        let out = from_utf8(buf.as_slice()).unwrap();
491 492 493
        let needs_wrapping = out.char_at(0) != '"' &&
            out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
494
        try!(f(self));
495
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
496
        Ok(())
497 498
    }

S
Sean McArthur 已提交
499 500 501
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
502
        try!(write!(self.wr, ":"));
503 504 505 506
        f(self)
    }
}

507 508
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
509
pub struct PrettyEncoder<'a> {
510 511
    wr: &'a mut io::Writer,
    indent: uint,
512 513
}

E
Erik Price 已提交
514
impl<'a> PrettyEncoder<'a> {
515
    /// Creates a new encoder whose output will be written to the specified writer
516
    pub fn new<'a>(wr: &'a mut io::Writer) -> PrettyEncoder<'a> {
517 518 519 520
        PrettyEncoder {
            wr: wr,
            indent: 0,
        }
521
    }
522
}
523

S
Sean McArthur 已提交
524 525
impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
    fn emit_nil(&mut self) -> EncodeResult { write!(self.wr, "null") }
526

S
Sean McArthur 已提交
527 528 529 530 531
    fn emit_uint(&mut self, v: uint) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult { self.emit_f64(v as f64) }
532

S
Sean McArthur 已提交
533 534 535 536 537
    fn emit_int(&mut self, v: int) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult { self.emit_f64(v as f64) }
538

S
Sean McArthur 已提交
539
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
540
        if v {
S
Sean McArthur 已提交
541
            write!(self.wr, "true")
542
        } else {
S
Sean McArthur 已提交
543
            write!(self.wr, "false")
544 545 546
        }
    }

S
Sean McArthur 已提交
547 548
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
        write!(self.wr, "{}", f64::to_str_digits(v, 6u))
A
Alex Crichton 已提交
549
    }
S
Sean McArthur 已提交
550
    fn emit_f32(&mut self, v: f32) -> EncodeResult { self.emit_f64(v as f64) }
551

S
Sean McArthur 已提交
552 553 554
    fn emit_char(&mut self, v: char) -> EncodeResult { self.emit_str(str::from_char(v)) }
    fn emit_str(&mut self, v: &str) -> EncodeResult {
        write!(self.wr, "{}", escape_str(v))
A
Alex Crichton 已提交
555
    }
556

S
Sean McArthur 已提交
557 558 559
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
560 561 562 563 564 565 566
        f(self)
    }

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _: uint,
                         cnt: uint,
S
Sean McArthur 已提交
567
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
568
        if cnt == 0 {
S
Sean McArthur 已提交
569
            write!(self.wr, "{}", escape_str(name))
570 571
        } else {
            self.indent += 2;
A
Alex Crichton 已提交
572
            try!(write!(self.wr, "[\n{}{},\n", spaces(self.indent),
A
Alex Crichton 已提交
573
                          escape_str(name)));
S
Sean McArthur 已提交
574
            try!(f(self));
575
            self.indent -= 2;
S
Sean McArthur 已提交
576
            write!(self.wr, "\n{}]", spaces(self.indent))
577 578 579 580 581
        }
    }

    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
582
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
583
        if idx != 0 {
A
Alex Crichton 已提交
584
            try!(write!(self.wr, ",\n"));
585
        }
A
Alex Crichton 已提交
586
        try!(write!(self.wr, "{}", spaces(self.indent)));
587 588 589 590 591 592 593
        f(self)
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
594
                                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
595 596 597 598 599 600
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
601
                                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
602 603 604 605 606 607 608
        self.emit_enum_variant_arg(idx, f)
    }


    fn emit_struct(&mut self,
                   _: &str,
                   len: uint,
S
Sean McArthur 已提交
609
                   f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
610
        if len == 0 {
S
Sean McArthur 已提交
611
            write!(self.wr, "\\{\\}")
612
        } else {
A
Alex Crichton 已提交
613
            try!(write!(self.wr, "\\{"));
614
            self.indent += 2;
S
Sean McArthur 已提交
615
            try!(f(self));
616
            self.indent -= 2;
S
Sean McArthur 已提交
617
            write!(self.wr, "\n{}\\}", spaces(self.indent))
618 619 620 621 622 623
        }
    }

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
624
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
625
        if idx == 0 {
A
Alex Crichton 已提交
626
            try!(write!(self.wr, "\n"));
627
        } else {
A
Alex Crichton 已提交
628
            try!(write!(self.wr, ",\n"));
629
        }
A
Alex Crichton 已提交
630
        try!(write!(self.wr, "{}{}: ", spaces(self.indent), escape_str(name)));
S
Sean McArthur 已提交
631
        f(self)
632 633
    }

S
Sean McArthur 已提交
634 635 636
    fn emit_tuple(&mut self,
                  len: uint,
                  f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
637 638
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
639 640 641
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
642 643 644 645 646 647
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _: &str,
                         len: uint,
S
Sean McArthur 已提交
648
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
649 650 651 652
        self.emit_seq(len, f)
    }
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
653
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
654 655 656
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
657 658 659 660 661 662 663
    fn emit_option(&mut self, f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
    fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() }
    fn emit_option_some(&mut self, f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
664

S
Sean McArthur 已提交
665 666 667
    fn emit_seq(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
668
        if len == 0 {
S
Sean McArthur 已提交
669
            write!(self.wr, "[]")
670
        } else {
A
Alex Crichton 已提交
671
            try!(write!(self.wr, "["));
672
            self.indent += 2;
S
Sean McArthur 已提交
673
            try!(f(self));
674
            self.indent -= 2;
S
Sean McArthur 已提交
675
            write!(self.wr, "\n{}]", spaces(self.indent))
676 677 678
        }
    }

S
Sean McArthur 已提交
679 680 681
    fn emit_seq_elt(&mut self,
                    idx: uint,
                    f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
682
        if idx == 0 {
A
Alex Crichton 已提交
683
            try!(write!(self.wr, "\n"));
684
        } else {
A
Alex Crichton 已提交
685
            try!(write!(self.wr, ",\n"));
686
        }
A
Alex Crichton 已提交
687
        try!(write!(self.wr, "{}", spaces(self.indent)));
688 689 690
        f(self)
    }

S
Sean McArthur 已提交
691 692 693
    fn emit_map(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
694
        if len == 0 {
S
Sean McArthur 已提交
695
            write!(self.wr, "\\{\\}")
696
        } else {
A
Alex Crichton 已提交
697
            try!(write!(self.wr, "\\{"));
698
            self.indent += 2;
S
Sean McArthur 已提交
699
            try!(f(self));
700
            self.indent -= 2;
S
Sean McArthur 已提交
701
            write!(self.wr, "\n{}\\}", spaces(self.indent))
702 703 704
        }
    }

S
Sean McArthur 已提交
705 706 707
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
708
        use std::str::from_utf8;
709
        if idx == 0 {
A
Alex Crichton 已提交
710
            try!(write!(self.wr, "\n"));
711
        } else {
A
Alex Crichton 已提交
712
            try!(write!(self.wr, ",\n"));
713
        }
A
Alex Crichton 已提交
714
        try!(write!(self.wr, "{}", spaces(self.indent)));
715 716 717 718
        // ref #12967, make sure to wrap a key in double quotes,
        // in the event that its of a type that omits them (eg numbers)
        let mut buf = MemWriter::new();
        let mut check_encoder = PrettyEncoder::new(&mut buf);
S
Sean McArthur 已提交
719
        try!(f(&mut check_encoder));
720
        let buf = buf.unwrap();
S
Steven Fackler 已提交
721
        let out = from_utf8(buf.as_slice()).unwrap();
722 723 724
        let needs_wrapping = out.char_at(0) != '"' &&
            out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
725
        try!(f(self));
726
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
727
        Ok(())
728 729
    }

S
Sean McArthur 已提交
730 731 732
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
733
        try!(write!(self.wr, ": "));
S
Sean McArthur 已提交
734
        f(self)
735 736 737
    }
}

738 739
impl<E: ::Encoder<S>, S> Encodable<E, S> for Json {
    fn encode(&self, e: &mut E) -> Result<(), S> {
740 741 742 743 744 745 746 747 748 749 750
        match *self {
            Number(v) => v.encode(e),
            String(ref v) => v.encode(e),
            Boolean(v) => v.encode(e),
            List(ref v) => v.encode(e),
            Object(ref v) => v.encode(e),
            Null => e.emit_nil(),
        }
    }
}

751
impl Json {
752
    /// Encodes a json value into a io::writer.  Uses a single line.
S
Sean McArthur 已提交
753
    pub fn to_writer(&self, wr: &mut io::Writer) -> EncodeResult {
754
        let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
755
        self.encode(&mut encoder)
756
    }
757

758 759
    /// Encodes a json value into a io::writer.
    /// Pretty-prints in a more readable format.
S
Sean McArthur 已提交
760
    pub fn to_pretty_writer(&self, wr: &mut io::Writer) -> EncodeResult {
761
        let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
762
        self.encode(&mut encoder)
763
    }
764

765 766
    /// Encodes a json value into a string
    pub fn to_pretty_str(&self) -> ~str {
767
        let mut s = MemWriter::new();
A
Alex Crichton 已提交
768
        self.to_pretty_writer(&mut s as &mut io::Writer).unwrap();
S
Steven Fackler 已提交
769
        str::from_utf8(s.unwrap().as_slice()).unwrap().to_owned()
770
    }
771 772 773 774 775 776 777 778 779 780 781

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
    pub fn find<'a>(&'a self, key: &~str) -> Option<&'a Json>{
        match self {
            &Object(ref map) => map.find(key),
            _ => None
        }
    }

    /// Attempts to get a nested Json Object for each key in `keys`.
782
    /// If any key is found not to exist, find_path will return None.
783 784
    /// Otherwise, it will return the Json value associated with the final key.
    pub fn find_path<'a>(&'a self, keys: &[&~str]) -> Option<&'a Json>{
785 786 787 788 789 790 791 792
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820
    }

    /// If the Json value is an Object, performs a depth-first search until
    /// a value associated with the provided key is found. If no value is found
    /// or the Json value is not an Object, returns None.
    pub fn search<'a>(&'a self, key: &~str) -> Option<&'a Json> {
        match self {
            &Object(ref map) => {
                match map.find(key) {
                    Some(json_value) => Some(json_value),
                    None => {
                        let mut value : Option<&'a Json> = None;
                        for (_, v) in map.iter() {
                            value = v.search(key);
                            if value.is_some() {
                                break;
                            }
                        }
                        value
                    }
                }
            },
            _ => None
        }
    }

    /// Returns true if the Json value is an Object. Returns false otherwise.
    pub fn is_object<'a>(&'a self) -> bool {
821
        self.as_object().is_some()
822 823 824 825 826 827 828 829 830 831 832 833 834
    }

    /// If the Json value is an Object, returns the associated TreeMap.
    /// Returns None otherwise.
    pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
        match self {
            &Object(ref map) => Some(&**map),
            _ => None
        }
    }

    /// Returns true if the Json value is a List. Returns false otherwise.
    pub fn is_list<'a>(&'a self) -> bool {
835
        self.as_list().is_some()
836 837 838 839 840 841 842 843 844 845 846 847
    }

    /// If the Json value is a List, returns the associated vector.
    /// Returns None otherwise.
    pub fn as_list<'a>(&'a self) -> Option<&'a List> {
        match self {
            &List(ref list) => Some(&*list),
            _ => None
        }
    }

    /// Returns true if the Json value is a String. Returns false otherwise.
848 849
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
850 851 852 853
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
854
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
855 856 857 858 859 860 861 862
        match *self {
            String(ref s) => Some(s.as_slice()),
            _ => None
        }
    }

    /// Returns true if the Json value is a Number. Returns false otherwise.
    pub fn is_number(&self) -> bool {
863
        self.as_number().is_some()
864 865 866 867 868 869 870 871 872 873 874 875 876
    }

    /// If the Json value is a Number, returns the associated f64.
    /// Returns None otherwise.
    pub fn as_number(&self) -> Option<f64> {
        match self {
            &Number(n) => Some(n),
            _ => None
        }
    }

    /// Returns true if the Json value is a Boolean. Returns false otherwise.
    pub fn is_boolean(&self) -> bool {
877
        self.as_boolean().is_some()
878 879 880 881 882 883 884 885 886 887 888 889 890
    }

    /// If the Json value is a Boolean, returns the associated bool.
    /// Returns None otherwise.
    pub fn as_boolean(&self) -> Option<bool> {
        match self {
            &Boolean(b) => Some(b),
            _ => None
        }
    }

    /// Returns true if the Json value is a Null. Returns false otherwise.
    pub fn is_null(&self) -> bool {
891
        self.as_null().is_some()
892 893 894 895 896 897 898 899 900 901
    }

    /// If the Json value is a Null, returns ().
    /// Returns None otherwise.
    pub fn as_null(&self) -> Option<()> {
        match self {
            &Null => Some(()),
            _ => None
        }
    }
E
Elly Jones 已提交
902 903
}

G
Gary Linscott 已提交
904
pub struct Parser<T> {
905 906 907 908
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
909 910
}

911 912
impl<T: Iterator<char>> Parser<T> {
    /// Decode a json value from an Iterator<char>
913
    pub fn new(rdr: T) -> Parser<T> {
914 915
        let mut p = Parser {
            rdr: rdr,
916
            ch: Some('\x00'),
917 918 919 920 921 922
            line: 1,
            col: 0,
        };
        p.bump();
        p
    }
923
}
E
Elly Jones 已提交
924

925
impl<T: Iterator<char>> Parser<T> {
S
Sean McArthur 已提交
926
    pub fn parse(&mut self) -> DecodeResult<Json> {
L
Luqman Aden 已提交
927 928
        match self.parse_value() {
          Ok(value) => {
929 930 931 932
            // Skip trailing whitespaces.
            self.parse_whitespace();
            // Make sure there is no trailing characters.
            if self.eof() {
L
Luqman Aden 已提交
933
                Ok(value)
934
            } else {
935
                self.error("trailing characters".to_owned())
936 937
            }
          }
L
Luqman Aden 已提交
938
          Err(e) => Err(e)
939 940
        }
    }
941 942
}

943
impl<T : Iterator<char>> Parser<T> {
944 945
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
946
    fn bump(&mut self) {
947
        self.ch = self.rdr.next();
E
Elly Jones 已提交
948

949
        if self.ch_is('\n') {
950 951
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
952 953
        } else {
            self.col += 1u;
E
Elly Jones 已提交
954
        }
955 956
    }

957
    fn next_char(&mut self) -> Option<char> {
958 959 960
        self.bump();
        self.ch
    }
961 962 963
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
964

S
Sean McArthur 已提交
965 966
    fn error<T>(&self, msg: ~str) -> DecodeResult<T> {
        Err(ParseError(msg, self.line, self.col))
E
Elly Jones 已提交
967 968
    }

S
Sean McArthur 已提交
969
    fn parse_value(&mut self) -> DecodeResult<Json> {
970 971
        self.parse_whitespace();

972
        if self.eof() { return self.error("EOF while parsing value".to_owned()); }
E
Elly Jones 已提交
973

974 975 976 977 978 979 980 981 982 983
        match self.ch_or_null() {
            'n' => self.parse_ident("ull", Null),
            't' => self.parse_ident("rue", Boolean(true)),
            'f' => self.parse_ident("alse", Boolean(false)),
            '0' .. '9' | '-' => self.parse_number(),
            '"' => {
                match self.parse_str() {
                    Ok(s) => Ok(String(s)),
                    Err(e) => Err(e),
                }
984
            },
985 986
            '[' => self.parse_list(),
            '{' => self.parse_object(),
987
            _ => self.error("invalid syntax".to_owned()),
E
Elly Jones 已提交
988
        }
989 990
    }

991
    fn parse_whitespace(&mut self) {
992 993 994 995
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
996 997
    }

S
Sean McArthur 已提交
998
    fn parse_ident(&mut self, ident: &str, value: Json) -> DecodeResult<Json> {
999
        if ident.chars().all(|c| Some(c) == self.next_char()) {
1000
            self.bump();
L
Luqman Aden 已提交
1001
            Ok(value)
1002
        } else {
1003
            self.error("invalid syntax".to_owned())
E
Elly Jones 已提交
1004 1005 1006
        }
    }

S
Sean McArthur 已提交
1007
    fn parse_number(&mut self) -> DecodeResult<Json> {
D
Daniel Micay 已提交
1008
        let mut neg = 1.0;
1009

1010
        if self.ch_is('-') {
1011
            self.bump();
D
Daniel Micay 已提交
1012
            neg = -1.0;
E
Elly Jones 已提交
1013
        }
1014

1015
        let mut res = match self.parse_integer() {
1016 1017
          Ok(res) => res,
          Err(e) => return Err(e)
1018 1019
        };

1020
        if self.ch_is('.') {
1021
            match self.parse_decimal(res) {
1022 1023
              Ok(r) => res = r,
              Err(e) => return Err(e)
1024
            }
E
Elly Jones 已提交
1025
        }
1026

1027
        if self.ch_is('e') || self.ch_is('E') {
1028
            match self.parse_exponent(res) {
1029 1030
              Ok(r) => res = r,
              Err(e) => return Err(e)
1031
            }
E
Elly Jones 已提交
1032
        }
1033

1034
        Ok(Number(neg * res))
E
Elly Jones 已提交
1035 1036
    }

S
Sean McArthur 已提交
1037
    fn parse_integer(&mut self) -> DecodeResult<f64> {
D
Daniel Micay 已提交
1038
        let mut res = 0.0;
E
Elly Jones 已提交
1039

1040 1041 1042
        match self.ch_or_null() {
            '0' => {
                self.bump();
1043

1044 1045
                // There can be only one leading '0'.
                match self.ch_or_null() {
1046
                    '0' .. '9' => return self.error("invalid number".to_owned()),
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
                    _ => ()
                }
            },
            '1' .. '9' => {
                while !self.eof() {
                    match self.ch_or_null() {
                        c @ '0' .. '9' => {
                            res *= 10.0;
                            res += ((c as int) - ('0' as int)) as f64;

                            self.bump();
                        }
                        _ => break,
                    }
1061 1062
                }
            }
1063
            _ => return self.error("invalid number".to_owned()),
E
Elly Jones 已提交
1064
        }
1065
        Ok(res)
E
Elly Jones 已提交
1066 1067
    }

S
Sean McArthur 已提交
1068
    fn parse_decimal(&mut self, res: f64) -> DecodeResult<f64> {
1069 1070 1071
        self.bump();

        // Make sure a digit follows the decimal place.
1072 1073
        match self.ch_or_null() {
            '0' .. '9' => (),
1074
             _ => return self.error("invalid number".to_owned())
1075 1076
        }

1077
        let mut res = res;
D
Daniel Micay 已提交
1078
        let mut dec = 1.0;
1079
        while !self.eof() {
1080 1081 1082 1083
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    dec /= 10.0;
                    res += (((c as int) - ('0' as int)) as f64) * dec;
1084

1085 1086 1087
                    self.bump();
                }
                _ => break,
E
Elly Jones 已提交
1088 1089
            }
        }
1090

1091
        Ok(res)
E
Elly Jones 已提交
1092 1093
    }

S
Sean McArthur 已提交
1094
    fn parse_exponent(&mut self, mut res: f64) -> DecodeResult<f64> {
1095 1096
        self.bump();

1097 1098
        let mut exp = 0u;
        let mut neg_exp = false;
1099

1100 1101 1102 1103 1104
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1105 1106 1107
        }

        // Make sure a digit follows the exponent place.
1108 1109
        match self.ch_or_null() {
            '0' .. '9' => (),
1110
            _ => return self.error("invalid number".to_owned())
1111 1112
        }
        while !self.eof() {
1113 1114 1115 1116
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1117

1118 1119 1120
                    self.bump();
                }
                _ => break
1121 1122 1123
            }
        }

1124
        let exp: f64 = num::pow(10u as f64, exp);
1125 1126 1127 1128 1129 1130
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1131
        Ok(res)
E
Elly Jones 已提交
1132 1133
    }

1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
    fn decode_hex_escape(&mut self) -> DecodeResult<u16> {
        let mut i = 0u;
        let mut n = 0u16;
        while i < 4u && !self.eof() {
            self.bump();
            n = match self.ch_or_null() {
                c @ '0' .. '9' => n * 16_u16 + ((c as u16) - ('0' as u16)),
                'a' | 'A' => n * 16_u16 + 10_u16,
                'b' | 'B' => n * 16_u16 + 11_u16,
                'c' | 'C' => n * 16_u16 + 12_u16,
                'd' | 'D' => n * 16_u16 + 13_u16,
                'e' | 'E' => n * 16_u16 + 14_u16,
                'f' | 'F' => n * 16_u16 + 15_u16,
                _ => return self.error(
1148
                    "invalid \\u escape (unrecognized hex)".to_owned())
1149 1150 1151 1152 1153 1154 1155 1156
            };

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
        if i != 4u {
            return self.error(
1157
                "invalid \\u escape (not four digits)".to_owned());
1158 1159 1160 1161 1162
        }

        Ok(n)
    }

S
Sean McArthur 已提交
1163
    fn parse_str(&mut self) -> DecodeResult<~str> {
1164
        let mut escape = false;
1165
        let mut res = StrBuf::new();
1166

G
Gary Linscott 已提交
1167
        loop {
1168
            self.bump();
G
Gary Linscott 已提交
1169
            if self.eof() {
1170
                return self.error("EOF while parsing string".to_owned());
G
Gary Linscott 已提交
1171
            }
1172

H
Huon Wilson 已提交
1173
            if escape {
1174 1175 1176 1177 1178 1179 1180 1181 1182
                match self.ch_or_null() {
                    '"' => res.push_char('"'),
                    '\\' => res.push_char('\\'),
                    '/' => res.push_char('/'),
                    'b' => res.push_char('\x08'),
                    'f' => res.push_char('\x0c'),
                    'n' => res.push_char('\n'),
                    'r' => res.push_char('\r'),
                    't' => res.push_char('\t'),
1183 1184
                    'u' => match try!(self.decode_hex_escape()) {
                        0xDC00 .. 0xDFFF => return self.error(
1185
                                "lone trailing surrogate in hex escape".to_owned()),
1186 1187 1188 1189 1190 1191 1192 1193

                        // Non-BMP characters are encoded as a sequence of
                        // two hex escapes, representing UTF-16 surrogates.
                        n1 @ 0xD800 .. 0xDBFF => {
                            let c1 = self.next_char();
                            let c2 = self.next_char();
                            match (c1, c2) {
                                (Some('\\'), Some('u')) => (),
1194
                                _ => return self.error(
1195
                                    "unexpected end of non-BMP hex escape".to_owned()),
1196
                            }
1197

1198 1199 1200 1201
                            let buf = [n1, try!(self.decode_hex_escape())];
                            match str::utf16_items(buf.as_slice()).next() {
                                Some(ScalarValue(c)) => res.push_char(c),
                                _ => return self.error(
1202
                                    "lone leading surrogate in hex escape".to_owned()),
1203
                            }
1204 1205
                        }

1206 1207 1208 1209 1210 1211
                        n => match char::from_u32(n as u32) {
                            Some(c) => res.push_char(c),
                            None => return self.error(
                                format!("invalid Unicode codepoint {:u}", n)),
                        },
                    },
1212
                    _ => return self.error("invalid escape".to_owned()),
1213 1214
                }
                escape = false;
1215
            } else if self.ch_is('\\') {
1216 1217
                escape = true;
            } else {
1218
                match self.ch {
1219 1220 1221 1222
                    Some('"') => {
                        self.bump();
                        return Ok(res.into_owned());
                    },
1223 1224
                    Some(c) => res.push_char(c),
                    None => unreachable!()
1225
                }
E
Elly Jones 已提交
1226 1227 1228 1229
            }
        }
    }

S
Sean McArthur 已提交
1230
    fn parse_list(&mut self) -> DecodeResult<Json> {
1231 1232 1233
        self.bump();
        self.parse_whitespace();

1234
        let mut values = Vec::new();
1235

1236
        if self.ch_is(']') {
1237
            self.bump();
1238
            return Ok(List(values.move_iter().collect()));
1239 1240
        }

1241
        loop {
L
Luqman Aden 已提交
1242 1243 1244
            match self.parse_value() {
              Ok(v) => values.push(v),
              Err(e) => return Err(e)
1245 1246 1247
            }

            self.parse_whitespace();
1248
            if self.eof() {
1249
                return self.error("EOF while parsing list".to_owned());
1250
            }
1251

1252 1253 1254 1255
            if self.ch_is(',') {
                self.bump();
            } else if self.ch_is(']') {
                self.bump();
1256
                return Ok(List(values.move_iter().collect()));
1257
            } else {
1258
                return self.error("expected `,` or `]`".to_owned())
1259
            }
1260
        };
E
Elly Jones 已提交
1261 1262
    }

S
Sean McArthur 已提交
1263
    fn parse_object(&mut self) -> DecodeResult<Json> {
1264 1265 1266
        self.bump();
        self.parse_whitespace();

1267
        let mut values = ~TreeMap::new();
1268

1269
        if self.ch_is('}') {
1270
          self.bump();
L
Luqman Aden 已提交
1271
          return Ok(Object(values));
1272 1273 1274 1275 1276
        }

        while !self.eof() {
            self.parse_whitespace();

1277
            if !self.ch_is('"') {
1278
                return self.error("key must be a string".to_owned());
1279 1280
            }

L
Luqman Aden 已提交
1281 1282 1283
            let key = match self.parse_str() {
              Ok(key) => key,
              Err(e) => return Err(e)
1284 1285 1286 1287
            };

            self.parse_whitespace();

1288
            if !self.ch_is(':') {
1289
                if self.eof() { break; }
1290
                return self.error("expected `:`".to_owned());
1291 1292 1293
            }
            self.bump();

L
Luqman Aden 已提交
1294 1295 1296
            match self.parse_value() {
              Ok(value) => { values.insert(key, value); }
              Err(e) => return Err(e)
1297 1298 1299
            }
            self.parse_whitespace();

1300 1301 1302 1303 1304
            match self.ch_or_null() {
                ',' => self.bump(),
                '}' => { self.bump(); return Ok(Object(values)); },
                _ => {
                    if self.eof() { break; }
1305
                    return self.error("expected `,` or `}`".to_owned());
1306
                }
1307 1308 1309
            }
        }

1310
        return self.error("EOF while parsing object".to_owned());
L
Lenny222 已提交
1311 1312 1313
    }
}

A
Alex Crichton 已提交
1314
/// Decodes a json value from an `&mut io::Reader`
S
Sean McArthur 已提交
1315
pub fn from_reader(rdr: &mut io::Reader) -> DecodeResult<Json> {
A
Alex Crichton 已提交
1316 1317
    let contents = match rdr.read_to_end() {
        Ok(c) => c,
S
Sean McArthur 已提交
1318
        Err(e) => return Err(IoError(e))
A
Alex Crichton 已提交
1319
    };
S
Steven Fackler 已提交
1320 1321
    let s = match str::from_utf8(contents.as_slice()) {
        Some(s) => s.to_owned(),
1322
        None => return Err(ParseError("contents not utf-8".to_owned(), 0, 0))
A
Alex Crichton 已提交
1323
    };
1324
    let mut parser = Parser::new(s.chars());
1325
    parser.parse()
E
Elly Jones 已提交
1326 1327
}

1328
/// Decodes a json value from a string
S
Sean McArthur 已提交
1329
pub fn from_str(s: &str) -> DecodeResult<Json> {
1330
    let mut parser = Parser::new(s.chars());
G
Gary Linscott 已提交
1331
    parser.parse()
1332 1333
}

1334
/// A structure to decode JSON to values in rust.
1335
pub struct Decoder {
1336
    stack: Vec<Json>,
1337 1338
}

1339 1340
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1341
    pub fn new(json: Json) -> Decoder {
1342
        Decoder {
1343
            stack: vec!(json),
1344
        }
1345
    }
1346 1347
}

1348
impl Decoder {
S
Sean McArthur 已提交
1349 1350
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
1351 1352 1353
    }
}

S
Sean McArthur 已提交
1354 1355 1356 1357
macro_rules! expect(
    ($e:expr, Null) => ({
        match $e {
            Null => Ok(()),
1358
            other => Err(ExpectedError("Null".to_owned(), format!("{}", other)))
S
Sean McArthur 已提交
1359 1360 1361 1362 1363 1364
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
            $t(v) => Ok(v),
            other => Err(ExpectedError(stringify!($t).to_owned(), format!("{}", other)))
1365
        }
S
Sean McArthur 已提交
1366 1367 1368 1369 1370 1371 1372 1373
    })
)

impl ::Decoder<Error> for Decoder {
    fn read_nil(&mut self) -> DecodeResult<()> {
        debug!("read_nil");
        try!(expect!(self.pop(), Null));
        Ok(())
1374 1375
    }

S
Sean McArthur 已提交
1376 1377 1378 1379 1380
    fn read_u64(&mut self)  -> DecodeResult<u64 > { Ok(try!(self.read_f64()) as u64) }
    fn read_u32(&mut self)  -> DecodeResult<u32 > { Ok(try!(self.read_f64()) as u32) }
    fn read_u16(&mut self)  -> DecodeResult<u16 > { Ok(try!(self.read_f64()) as u16) }
    fn read_u8 (&mut self)  -> DecodeResult<u8  > { Ok(try!(self.read_f64()) as u8) }
    fn read_uint(&mut self) -> DecodeResult<uint> { Ok(try!(self.read_f64()) as uint) }
1381

S
Sean McArthur 已提交
1382 1383 1384 1385 1386
    fn read_i64(&mut self) -> DecodeResult<i64> { Ok(try!(self.read_f64()) as i64) }
    fn read_i32(&mut self) -> DecodeResult<i32> { Ok(try!(self.read_f64()) as i32) }
    fn read_i16(&mut self) -> DecodeResult<i16> { Ok(try!(self.read_f64()) as i16) }
    fn read_i8 (&mut self) -> DecodeResult<i8 > { Ok(try!(self.read_f64()) as i8) }
    fn read_int(&mut self) -> DecodeResult<int> { Ok(try!(self.read_f64()) as int) }
1387

S
Sean McArthur 已提交
1388
    fn read_bool(&mut self) -> DecodeResult<bool> {
1389
        debug!("read_bool");
S
Sean McArthur 已提交
1390
        Ok(try!(expect!(self.pop(), Boolean)))
1391 1392
    }

S
Sean McArthur 已提交
1393
    fn read_f64(&mut self) -> DecodeResult<f64> {
1394
        use std::from_str::FromStr;
1395
        debug!("read_f64");
S
Sean McArthur 已提交
1396 1397
        match self.pop() {
            Number(f) => Ok(f),
1398 1399 1400
            String(s) => {
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
                // is going to have a string here, as per JSON spec..
S
Sean McArthur 已提交
1401
                Ok(FromStr::from_str(s).unwrap())
1402
            },
1403
            value => Err(ExpectedError("Number".to_owned(), format!("{}", value)))
1404 1405
        }
    }
1406

S
Sean McArthur 已提交
1407
    fn read_f32(&mut self) -> DecodeResult<f32> { Ok(try!(self.read_f64()) as f32) }
1408

S
Sean McArthur 已提交
1409 1410
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
1411
        {
1412
            let mut it = s.chars();
1413 1414
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
1415
                (Some(c), None) => return Ok(c),
1416 1417 1418
                _ => ()
            }
        }
1419
        Err(ExpectedError("single character string".to_owned(), format!("{}", s)))
1420 1421
    }

S
Sean McArthur 已提交
1422
    fn read_str(&mut self) -> DecodeResult<~str> {
1423
        debug!("read_str");
S
Sean McArthur 已提交
1424
        Ok(try!(expect!(self.pop(), String)))
1425 1426
    }

S
Sean McArthur 已提交
1427 1428 1429
    fn read_enum<T>(&mut self,
                    name: &str,
                    f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1430
        debug!("read_enum({})", name);
1431 1432 1433 1434 1435
        f(self)
    }

    fn read_enum_variant<T>(&mut self,
                            names: &[&str],
S
Sean McArthur 已提交
1436 1437
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1438
        debug!("read_enum_variant(names={:?})", names);
S
Sean McArthur 已提交
1439
        let name = match self.pop() {
1440
            String(s) => s,
1441
            Object(mut o) => {
1442
                let n = match o.pop(&"variant".to_owned()) {
1443
                    Some(String(s)) => s,
1444 1445
                    Some(val) => return Err(ExpectedError("String".to_owned(), format!("{}", val))),
                    None => return Err(MissingFieldError("variant".to_owned()))
1446
                };
1447
                match o.pop(&"fields".to_owned()) {
1448 1449
                    Some(List(l)) => {
                        for field in l.move_rev_iter() {
1450 1451 1452
                            self.stack.push(field.clone());
                        }
                    },
1453 1454
                    Some(val) => return Err(ExpectedError("List".to_owned(), format!("{}", val))),
                    None => return Err(MissingFieldError("fields".to_owned()))
1455
                }
1456
                n
1457
            }
1458
            json => return Err(ExpectedError("String or Object".to_owned(), format!("{}", json)))
1459
        };
1460
        let idx = match names.iter().position(|n| str::eq_slice(*n, name)) {
1461
            Some(idx) => idx,
S
Sean McArthur 已提交
1462
            None => return Err(UnknownVariantError(name))
1463 1464 1465 1466
        };
        f(self, idx)
    }

S
Sean McArthur 已提交
1467 1468
    fn read_enum_variant_arg<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
1469
        debug!("read_enum_variant_arg(idx={})", idx);
1470 1471 1472 1473 1474
        f(self)
    }

    fn read_enum_struct_variant<T>(&mut self,
                                   names: &[&str],
S
Sean McArthur 已提交
1475 1476
                                   f: |&mut Decoder, uint| -> DecodeResult<T>)
                                   -> DecodeResult<T> {
1477
        debug!("read_enum_struct_variant(names={:?})", names);
1478 1479 1480 1481 1482 1483 1484
        self.read_enum_variant(names, f)
    }


    fn read_enum_struct_variant_field<T>(&mut self,
                                         name: &str,
                                         idx: uint,
S
Sean McArthur 已提交
1485 1486
                                         f: |&mut Decoder| -> DecodeResult<T>)
                                         -> DecodeResult<T> {
1487
        debug!("read_enum_struct_variant_field(name={}, idx={})", name, idx);
1488 1489 1490 1491 1492 1493
        self.read_enum_variant_arg(idx, f)
    }

    fn read_struct<T>(&mut self,
                      name: &str,
                      len: uint,
S
Sean McArthur 已提交
1494 1495
                      f: |&mut Decoder| -> DecodeResult<T>)
                      -> DecodeResult<T> {
1496
        debug!("read_struct(name={}, len={})", name, len);
S
Sean McArthur 已提交
1497 1498 1499
        let value = try!(f(self));
        self.pop();
        Ok(value)
1500 1501 1502 1503 1504
    }

    fn read_struct_field<T>(&mut self,
                            name: &str,
                            idx: uint,
S
Sean McArthur 已提交
1505 1506
                            f: |&mut Decoder| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1507
        debug!("read_struct_field(name={}, idx={})", name, idx);
S
Sean McArthur 已提交
1508 1509 1510 1511 1512 1513 1514
        let mut obj = try!(expect!(self.pop(), Object));

        let value = match obj.pop(&name.to_owned()) {
            None => return Err(MissingFieldError(name.to_owned())),
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
1515
            }
S
Sean McArthur 已提交
1516 1517 1518
        };
        self.stack.push(Object(obj));
        Ok(value)
1519 1520
    }

S
Sean McArthur 已提交
1521
    fn read_tuple<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1522
        debug!("read_tuple()");
1523 1524 1525
        self.read_seq(f)
    }

S
Sean McArthur 已提交
1526 1527 1528
    fn read_tuple_arg<T>(&mut self,
                         idx: uint,
                         f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1529
        debug!("read_tuple_arg(idx={})", idx);
1530 1531 1532 1533 1534
        self.read_seq_elt(idx, f)
    }

    fn read_tuple_struct<T>(&mut self,
                            name: &str,
S
Sean McArthur 已提交
1535 1536
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1537
        debug!("read_tuple_struct(name={})", name);
1538 1539 1540 1541 1542
        self.read_tuple(f)
    }

    fn read_tuple_struct_arg<T>(&mut self,
                                idx: uint,
S
Sean McArthur 已提交
1543 1544
                                f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
1545
        debug!("read_tuple_struct_arg(idx={})", idx);
1546 1547 1548
        self.read_tuple_arg(idx, f)
    }

S
Sean McArthur 已提交
1549 1550
    fn read_option<T>(&mut self, f: |&mut Decoder, bool| -> DecodeResult<T>) -> DecodeResult<T> {
        match self.pop() {
1551 1552 1553 1554 1555
            Null => f(self, false),
            value => { self.stack.push(value); f(self, true) }
        }
    }

S
Sean McArthur 已提交
1556
    fn read_seq<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1557
        debug!("read_seq()");
S
Sean McArthur 已提交
1558 1559 1560 1561 1562
        let list = try!(expect!(self.pop(), List));
        let len = list.len();
        for v in list.move_rev_iter() {
            self.stack.push(v);
        }
1563 1564 1565
        f(self, len)
    }

S
Sean McArthur 已提交
1566 1567 1568
    fn read_seq_elt<T>(&mut self,
                       idx: uint,
                       f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1569
        debug!("read_seq_elt(idx={})", idx);
1570 1571 1572
        f(self)
    }

S
Sean McArthur 已提交
1573
    fn read_map<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1574
        debug!("read_map()");
S
Sean McArthur 已提交
1575 1576 1577 1578 1579 1580
        let obj = try!(expect!(self.pop(), Object));
        let len = obj.len();
        for (key, value) in obj.move_iter() {
            self.stack.push(value);
            self.stack.push(String(key));
        }
1581 1582 1583
        f(self, len)
    }

S
Sean McArthur 已提交
1584 1585
    fn read_map_elt_key<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
1586
        debug!("read_map_elt_key(idx={})", idx);
1587 1588 1589
        f(self)
    }

S
Sean McArthur 已提交
1590 1591
    fn read_map_elt_val<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
1592
        debug!("read_map_elt_val(idx={})", idx);
1593 1594 1595 1596
        f(self)
    }
}

1597
/// Test if two json values are less than one another
1598
impl Ord for Json {
1599
    fn lt(&self, other: &Json) -> bool {
H
Huon Wilson 已提交
1600
        match *self {
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624
            Number(f0) => {
                match *other {
                    Number(f1) => f0 < f1,
                    String(_) | Boolean(_) | List(_) | Object(_) |
                    Null => true
                }
            }

            String(ref s0) => {
                match *other {
                    Number(_) => false,
                    String(ref s1) => s0 < s1,
                    Boolean(_) | List(_) | Object(_) | Null => true
                }
            }

            Boolean(b0) => {
                match *other {
                    Number(_) | String(_) => false,
                    Boolean(b1) => b0 < b1,
                    List(_) | Object(_) | Null => true
                }
            }

1625
            List(ref l0) => {
1626 1627
                match *other {
                    Number(_) | String(_) | Boolean(_) => false,
1628
                    List(ref l1) => (*l0) < (*l1),
1629 1630 1631 1632 1633 1634 1635
                    Object(_) | Null => true
                }
            }

            Object(ref d0) => {
                match *other {
                    Number(_) | String(_) | Boolean(_) | List(_) => false,
1636
                    Object(ref d1) => d0 < d1,
1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
                    Null => true
                }
            }

            Null => {
                match *other {
                    Number(_) | String(_) | Boolean(_) | List(_) |
                    Object(_) =>
                        false,
                    Null => true
                }
            }
        }
    }
1651
}
1652

1653
/// A trait for converting values to JSON
1654
pub trait ToJson {
1655 1656 1657
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
1658

1659
impl ToJson for Json {
1660
    fn to_json(&self) -> Json { (*self).clone() }
1661 1662
}

1663
impl ToJson for int {
D
Daniel Micay 已提交
1664
    fn to_json(&self) -> Json { Number(*self as f64) }
1665 1666
}

1667
impl ToJson for i8 {
D
Daniel Micay 已提交
1668
    fn to_json(&self) -> Json { Number(*self as f64) }
1669 1670
}

1671
impl ToJson for i16 {
D
Daniel Micay 已提交
1672
    fn to_json(&self) -> Json { Number(*self as f64) }
1673 1674
}

1675
impl ToJson for i32 {
D
Daniel Micay 已提交
1676
    fn to_json(&self) -> Json { Number(*self as f64) }
1677 1678
}

1679
impl ToJson for i64 {
D
Daniel Micay 已提交
1680
    fn to_json(&self) -> Json { Number(*self as f64) }
1681 1682
}

1683
impl ToJson for uint {
D
Daniel Micay 已提交
1684
    fn to_json(&self) -> Json { Number(*self as f64) }
1685 1686
}

1687
impl ToJson for u8 {
D
Daniel Micay 已提交
1688
    fn to_json(&self) -> Json { Number(*self as f64) }
1689 1690
}

1691
impl ToJson for u16 {
D
Daniel Micay 已提交
1692
    fn to_json(&self) -> Json { Number(*self as f64) }
1693 1694
}

1695
impl ToJson for u32 {
D
Daniel Micay 已提交
1696
    fn to_json(&self) -> Json { Number(*self as f64) }
1697 1698
}

1699
impl ToJson for u64 {
D
Daniel Micay 已提交
1700
    fn to_json(&self) -> Json { Number(*self as f64) }
1701 1702
}

1703
impl ToJson for f32 {
D
Daniel Micay 已提交
1704
    fn to_json(&self) -> Json { Number(*self as f64) }
1705 1706
}

1707
impl ToJson for f64 {
D
Daniel Micay 已提交
1708
    fn to_json(&self) -> Json { Number(*self) }
1709 1710
}

1711
impl ToJson for () {
B
Ben Striegel 已提交
1712
    fn to_json(&self) -> Json { Null }
1713 1714
}

1715
impl ToJson for bool {
B
Ben Striegel 已提交
1716
    fn to_json(&self) -> Json { Boolean(*self) }
1717 1718
}

1719
impl ToJson for ~str {
1720
    fn to_json(&self) -> Json { String((*self).clone()) }
1721 1722
}

1723
impl<A:ToJson,B:ToJson> ToJson for (A, B) {
B
Ben Striegel 已提交
1724 1725
    fn to_json(&self) -> Json {
        match *self {
1726
          (ref a, ref b) => {
1727
            List(~[a.to_json(), b.to_json()])
1728 1729
          }
        }
1730 1731 1732
    }
}

1733
impl<A:ToJson,B:ToJson,C:ToJson> ToJson for (A, B, C) {
B
Ben Striegel 已提交
1734 1735
    fn to_json(&self) -> Json {
        match *self {
1736
          (ref a, ref b, ref c) => {
1737
            List(~[a.to_json(), b.to_json(), c.to_json()])
1738 1739
          }
        }
1740 1741 1742
    }
}

1743
impl<A:ToJson> ToJson for ~[A] {
1744
    fn to_json(&self) -> Json { List(self.iter().map(|elt| elt.to_json()).collect()) }
1745 1746
}

1747
impl<A:ToJson> ToJson for TreeMap<~str, A> {
B
Ben Striegel 已提交
1748
    fn to_json(&self) -> Json {
1749
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
1750
        for (key, value) in self.iter() {
1751
            d.insert((*key).clone(), value.to_json());
1752 1753 1754 1755 1756
        }
        Object(~d)
    }
}

1757
impl<A:ToJson> ToJson for HashMap<~str, A> {
G
Graydon Hoare 已提交
1758
    fn to_json(&self) -> Json {
1759
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
1760
        for (key, value) in self.iter() {
1761
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
1762 1763 1764 1765 1766
        }
        Object(~d)
    }
}

1767
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
1768 1769
    fn to_json(&self) -> Json {
        match *self {
B
Ben Striegel 已提交
1770
          None => Null,
1771
          Some(ref value) => value.to_json()
1772 1773 1774 1775
        }
    }
}

1776
impl fmt::Show for Json {
1777
    /// Encodes a json value into a string
1778 1779
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        self.to_writer(f.buf)
1780
    }
1781 1782
}

1783 1784
#[cfg(test)]
mod tests {
A
Alex Crichton 已提交
1785 1786
    use {Encodable, Decodable};
    use super::{Encoder, Decoder, Error, Boolean, Number, List, String, Null,
S
Sean McArthur 已提交
1787 1788
                PrettyEncoder, Object, Json, from_str, ParseError, ExpectedError,
                MissingFieldError, UnknownVariantError, DecodeResult };
A
Alex Crichton 已提交
1789
    use std::io;
1790
    use collections::TreeMap;
1791

1792
    #[deriving(Eq, Encodable, Decodable, Show)]
1793 1794 1795 1796 1797
    enum Animal {
        Dog,
        Frog(~str, int)
    }

1798
    #[deriving(Eq, Encodable, Decodable, Show)]
1799 1800 1801 1802 1803 1804
    struct Inner {
        a: (),
        b: uint,
        c: ~[~str],
    }

1805
    #[deriving(Eq, Encodable, Decodable, Show)]
1806 1807 1808 1809
    struct Outer {
        inner: ~[Inner],
    }

1810
    fn mk_object(items: &[(~str, Json)]) -> Json {
1811
        let mut d = ~TreeMap::new();
1812

D
Daniel Micay 已提交
1813
        for item in items.iter() {
1814
            match *item {
1815
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
1816
            }
1817 1818
        };

L
Luqman Aden 已提交
1819
        Object(d)
1820 1821 1822 1823
    }

    #[test]
    fn test_write_null() {
1824 1825
        assert_eq!(Null.to_str(), "null".to_owned());
        assert_eq!(Null.to_pretty_str(), "null".to_owned());
1826 1827
    }

1828

1829
    #[test]
1830
    fn test_write_number() {
1831 1832
        assert_eq!(Number(3.0).to_str(), "3".to_owned());
        assert_eq!(Number(3.0).to_pretty_str(), "3".to_owned());
1833

1834 1835
        assert_eq!(Number(3.1).to_str(), "3.1".to_owned());
        assert_eq!(Number(3.1).to_pretty_str(), "3.1".to_owned());
1836

1837 1838
        assert_eq!(Number(-1.5).to_str(), "-1.5".to_owned());
        assert_eq!(Number(-1.5).to_pretty_str(), "-1.5".to_owned());
1839

1840 1841
        assert_eq!(Number(0.5).to_str(), "0.5".to_owned());
        assert_eq!(Number(0.5).to_pretty_str(), "0.5".to_owned());
1842 1843 1844 1845
    }

    #[test]
    fn test_write_str() {
1846 1847
        assert_eq!(String("".to_owned()).to_str(), "\"\"".to_owned());
        assert_eq!(String("".to_owned()).to_pretty_str(), "\"\"".to_owned());
1848

1849 1850
        assert_eq!(String("foo".to_owned()).to_str(), "\"foo\"".to_owned());
        assert_eq!(String("foo".to_owned()).to_pretty_str(), "\"foo\"".to_owned());
1851 1852 1853 1854
    }

    #[test]
    fn test_write_bool() {
1855 1856
        assert_eq!(Boolean(true).to_str(), "true".to_owned());
        assert_eq!(Boolean(true).to_pretty_str(), "true".to_owned());
1857

1858 1859
        assert_eq!(Boolean(false).to_str(), "false".to_owned());
        assert_eq!(Boolean(false).to_pretty_str(), "false".to_owned());
1860 1861 1862 1863
    }

    #[test]
    fn test_write_list() {
1864 1865
        assert_eq!(List(~[]).to_str(), "[]".to_owned());
        assert_eq!(List(~[]).to_pretty_str(), "[]".to_owned());
1866

1867
        assert_eq!(List(~[Boolean(true)]).to_str(), "[true]".to_owned());
1868
        assert_eq!(
1869
            List(~[Boolean(true)]).to_pretty_str(),
1870
            "\
1871 1872
            [\n  \
                true\n\
1873
            ]".to_owned()
1874
        );
1875

1876
        let long_test_list = List(~[
1877 1878
            Boolean(false),
            Null,
1879
            List(~[String("foo\nbar".to_owned()), Number(3.5)])]);
1880

1881
        assert_eq!(long_test_list.to_str(),
1882
            "[false,null,[\"foo\\nbar\",3.5]]".to_owned());
1883
        assert_eq!(
1884
            long_test_list.to_pretty_str(),
1885
            "\
1886 1887 1888 1889 1890 1891 1892
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
1893
            ]".to_owned()
1894 1895 1896
        );
    }

1897
    #[test]
1898
    fn test_write_object() {
1899 1900
        assert_eq!(mk_object([]).to_str(), "{}".to_owned());
        assert_eq!(mk_object([]).to_pretty_str(), "{}".to_owned());
1901

1902
        assert_eq!(
1903 1904
            mk_object([("a".to_owned(), Boolean(true))]).to_str(),
            "{\"a\":true}".to_owned()
1905
        );
1906
        assert_eq!(
1907 1908
            mk_object([("a".to_owned(), Boolean(true))]).to_pretty_str(),
            "\
1909 1910
            {\n  \
                \"a\": true\n\
1911
            }".to_owned()
1912 1913
        );

1914
        let complex_obj = mk_object([
1915 1916 1917
                ("b".to_owned(), List(~[
                    mk_object([("c".to_owned(), String("\x0c\r".to_owned()))]),
                    mk_object([("d".to_owned(), String("".to_owned()))])
1918
                ]))
1919 1920 1921
            ]);

        assert_eq!(
1922
            complex_obj.to_str(),
1923
            "{\
1924 1925 1926 1927
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
1928
            }".to_owned()
1929 1930
        );
        assert_eq!(
1931
            complex_obj.to_pretty_str(),
1932
            "\
1933 1934 1935 1936 1937 1938 1939 1940 1941
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
1942
            }".to_owned()
1943
        );
1944

E
Erick Tryzelaar 已提交
1945
        let a = mk_object([
1946 1947 1948 1949
            ("a".to_owned(), Boolean(true)),
            ("b".to_owned(), List(~[
                mk_object([("c".to_owned(), String("\x0c\r".to_owned()))]),
                mk_object([("d".to_owned(), String("".to_owned()))])
1950
            ]))
G
Graydon Hoare 已提交
1951
        ]);
1952

1953 1954
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
1955 1956
        assert_eq!(a.clone(), from_str(a.to_str()).unwrap());
        assert_eq!(a.clone(), from_str(a.to_pretty_str()).unwrap());
1957 1958
    }

1959
    fn with_str_writer(f: |&mut io::Writer|) -> ~str {
A
Alex Crichton 已提交
1960
        use std::io::MemWriter;
A
Alex Crichton 已提交
1961 1962
        use std::str;

1963 1964
        let mut m = MemWriter::new();
        f(&mut m as &mut io::Writer);
S
Steven Fackler 已提交
1965
        str::from_utf8(m.unwrap().as_slice()).unwrap().to_owned()
A
Alex Crichton 已提交
1966 1967
    }

1968
    #[test]
1969
    fn test_write_enum() {
1970
        let animal = Dog;
1971
        assert_eq!(
1972
            with_str_writer(|wr| {
1973
                let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
1974
                animal.encode(&mut encoder).unwrap();
1975
            }),
1976
            "\"Dog\"".to_owned()
1977 1978
        );
        assert_eq!(
1979
            with_str_writer(|wr| {
1980
                let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
1981
                animal.encode(&mut encoder).unwrap();
1982
            }),
1983
            "\"Dog\"".to_owned()
1984
        );
1985

1986
        let animal = Frog("Henry".to_owned(), 349);
1987
        assert_eq!(
1988
            with_str_writer(|wr| {
1989
                let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
1990
                animal.encode(&mut encoder).unwrap();
1991
            }),
1992
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}".to_owned()
1993 1994
        );
        assert_eq!(
1995
            with_str_writer(|wr| {
1996
                let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
1997
                animal.encode(&mut encoder).unwrap();
1998
            }),
1999
            "\
2000 2001
            [\n  \
                \"Frog\",\n  \
2002 2003
                \"Henry\",\n  \
                349\n\
2004
            ]".to_owned()
2005
        );
2006 2007 2008
    }

    #[test]
2009
    fn test_write_some() {
2010
        let value = Some("jodhpurs".to_owned());
2011
        let s = with_str_writer(|wr| {
2012
            let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2013
            value.encode(&mut encoder).unwrap();
2014
        });
2015
        assert_eq!(s, "\"jodhpurs\"".to_owned());
2016

2017
        let value = Some("jodhpurs".to_owned());
2018
        let s = with_str_writer(|wr| {
2019
            let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
2020
            value.encode(&mut encoder).unwrap();
2021
        });
2022
        assert_eq!(s, "\"jodhpurs\"".to_owned());
2023 2024
    }

2025
    #[test]
2026 2027
    fn test_write_none() {
        let value: Option<~str> = None;
2028
        let s = with_str_writer(|wr| {
2029
            let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2030
            value.encode(&mut encoder).unwrap();
2031
        });
2032
        assert_eq!(s, "null".to_owned());
J
John Clements 已提交
2033

2034
        let s = with_str_writer(|wr| {
2035
            let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2036
            value.encode(&mut encoder).unwrap();
2037
        });
2038
        assert_eq!(s, "null".to_owned());
2039 2040
    }

2041
    #[test]
2042
    fn test_trailing_characters() {
E
Erick Tryzelaar 已提交
2043
        assert_eq!(from_str("nulla"),
2044
            Err(ParseError("trailing characters".to_owned(), 1u, 5u)));
E
Erick Tryzelaar 已提交
2045
        assert_eq!(from_str("truea"),
2046
            Err(ParseError("trailing characters".to_owned(), 1u, 5u)));
E
Erick Tryzelaar 已提交
2047
        assert_eq!(from_str("falsea"),
2048
            Err(ParseError("trailing characters".to_owned(), 1u, 6u)));
E
Erick Tryzelaar 已提交
2049
        assert_eq!(from_str("1a"),
2050
            Err(ParseError("trailing characters".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2051
        assert_eq!(from_str("[]a"),
2052
            Err(ParseError("trailing characters".to_owned(), 1u, 3u)));
E
Erick Tryzelaar 已提交
2053
        assert_eq!(from_str("{}a"),
2054
            Err(ParseError("trailing characters".to_owned(), 1u, 3u)));
2055 2056 2057 2058
    }

    #[test]
    fn test_read_identifiers() {
E
Erick Tryzelaar 已提交
2059
        assert_eq!(from_str("n"),
2060
            Err(ParseError("invalid syntax".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2061
        assert_eq!(from_str("nul"),
2062
            Err(ParseError("invalid syntax".to_owned(), 1u, 4u)));
2063

E
Erick Tryzelaar 已提交
2064
        assert_eq!(from_str("t"),
2065
            Err(ParseError("invalid syntax".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2066
        assert_eq!(from_str("truz"),
2067
            Err(ParseError("invalid syntax".to_owned(), 1u, 4u)));
2068

E
Erick Tryzelaar 已提交
2069
        assert_eq!(from_str("f"),
2070
            Err(ParseError("invalid syntax".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2071
        assert_eq!(from_str("faz"),
2072
            Err(ParseError("invalid syntax".to_owned(), 1u, 3u)));
2073

E
Erick Tryzelaar 已提交
2074 2075 2076 2077 2078 2079
        assert_eq!(from_str("null"), Ok(Null));
        assert_eq!(from_str("true"), Ok(Boolean(true)));
        assert_eq!(from_str("false"), Ok(Boolean(false)));
        assert_eq!(from_str(" null "), Ok(Null));
        assert_eq!(from_str(" true "), Ok(Boolean(true)));
        assert_eq!(from_str(" false "), Ok(Boolean(false)));
2080 2081
    }

2082 2083
    #[test]
    fn test_decode_identifiers() {
2084
        let mut decoder = Decoder::new(from_str("null").unwrap());
S
Sean McArthur 已提交
2085
        let v: () = Decodable::decode(&mut decoder).unwrap();
2086 2087
        assert_eq!(v, ());

2088
        let mut decoder = Decoder::new(from_str("true").unwrap());
S
Sean McArthur 已提交
2089
        let v: bool = Decodable::decode(&mut decoder).unwrap();
2090 2091
        assert_eq!(v, true);

2092
        let mut decoder = Decoder::new(from_str("false").unwrap());
S
Sean McArthur 已提交
2093
        let v: bool = Decodable::decode(&mut decoder).unwrap();
2094 2095 2096
        assert_eq!(v, false);
    }

2097
    #[test]
2098
    fn test_read_number() {
E
Erick Tryzelaar 已提交
2099
        assert_eq!(from_str("+"),
2100
            Err(ParseError("invalid syntax".to_owned(), 1u, 1u)));
E
Erick Tryzelaar 已提交
2101
        assert_eq!(from_str("."),
2102
            Err(ParseError("invalid syntax".to_owned(), 1u, 1u)));
2103

E
Erick Tryzelaar 已提交
2104
        assert_eq!(from_str("-"),
2105
            Err(ParseError("invalid number".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2106
        assert_eq!(from_str("00"),
2107
            Err(ParseError("invalid number".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2108
        assert_eq!(from_str("1."),
2109
            Err(ParseError("invalid number".to_owned(), 1u, 3u)));
E
Erick Tryzelaar 已提交
2110
        assert_eq!(from_str("1e"),
2111
            Err(ParseError("invalid number".to_owned(), 1u, 3u)));
E
Erick Tryzelaar 已提交
2112
        assert_eq!(from_str("1e+"),
2113
            Err(ParseError("invalid number".to_owned(), 1u, 4u)));
2114

D
Daniel Micay 已提交
2115 2116 2117 2118 2119 2120 2121 2122
        assert_eq!(from_str("3"), Ok(Number(3.0)));
        assert_eq!(from_str("3.1"), Ok(Number(3.1)));
        assert_eq!(from_str("-1.2"), Ok(Number(-1.2)));
        assert_eq!(from_str("0.4"), Ok(Number(0.4)));
        assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5)));
        assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15)));
        assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01)));
        assert_eq!(from_str(" 3 "), Ok(Number(3.0)));
2123 2124
    }

2125 2126
    #[test]
    fn test_decode_numbers() {
2127
        let mut decoder = Decoder::new(from_str("3").unwrap());
S
Sean McArthur 已提交
2128
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2129
        assert_eq!(v, 3.0);
2130

2131
        let mut decoder = Decoder::new(from_str("3.1").unwrap());
S
Sean McArthur 已提交
2132
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2133
        assert_eq!(v, 3.1);
2134

2135
        let mut decoder = Decoder::new(from_str("-1.2").unwrap());
S
Sean McArthur 已提交
2136
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2137
        assert_eq!(v, -1.2);
2138

2139
        let mut decoder = Decoder::new(from_str("0.4").unwrap());
S
Sean McArthur 已提交
2140
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2141
        assert_eq!(v, 0.4);
2142

2143
        let mut decoder = Decoder::new(from_str("0.4e5").unwrap());
S
Sean McArthur 已提交
2144
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2145
        assert_eq!(v, 0.4e5);
2146

2147
        let mut decoder = Decoder::new(from_str("0.4e15").unwrap());
S
Sean McArthur 已提交
2148
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2149
        assert_eq!(v, 0.4e15);
2150

2151
        let mut decoder = Decoder::new(from_str("0.4e-01").unwrap());
S
Sean McArthur 已提交
2152
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2153
        assert_eq!(v, 0.4e-01);
2154 2155
    }

G
Gary Linscott 已提交
2156
    #[test]
2157
    fn test_read_str() {
E
Erick Tryzelaar 已提交
2158
        assert_eq!(from_str("\""),
2159
            Err(ParseError("EOF while parsing string".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2160
        assert_eq!(from_str("\"lol"),
2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172
            Err(ParseError("EOF while parsing string".to_owned(), 1u, 5u)));

        assert_eq!(from_str("\"\""), Ok(String("".to_owned())));
        assert_eq!(from_str("\"foo\""), Ok(String("foo".to_owned())));
        assert_eq!(from_str("\"\\\"\""), Ok(String("\"".to_owned())));
        assert_eq!(from_str("\"\\b\""), Ok(String("\x08".to_owned())));
        assert_eq!(from_str("\"\\n\""), Ok(String("\n".to_owned())));
        assert_eq!(from_str("\"\\r\""), Ok(String("\r".to_owned())));
        assert_eq!(from_str("\"\\t\""), Ok(String("\t".to_owned())));
        assert_eq!(from_str(" \"foo\" "), Ok(String("foo".to_owned())));
        assert_eq!(from_str("\"\\u12ab\""), Ok(String("\u12ab".to_owned())));
        assert_eq!(from_str("\"\\uAB12\""), Ok(String("\uAB12".to_owned())));
2173 2174 2175

        // Non-BMP escapes.  The exact error messages and positions are kind of
        // arbitrary.
2176
        assert_eq!(from_str("\"\\ud83d\\udca9\""), Ok(String("\U0001F4A9".to_owned())));
2177 2178 2179 2180 2181 2182
        assert!(from_str("\"\\ud83d\"").is_err());
        assert!(from_str("\"\\udca9\"").is_err());
        assert!(from_str("\"\\ud83d\\ud83d\"").is_err());
        assert!(from_str("\"\\ud83dx\"").is_err());
        assert!(from_str("\"\\udca9\\udca9\"").is_err());
        assert!(from_str("\"\\udca9x\"").is_err());
2183 2184
    }

2185
    #[test]
2186
    fn test_decode_str() {
2187
        let mut decoder = Decoder::new(from_str("\"\"").unwrap());
S
Sean McArthur 已提交
2188
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2189
        assert_eq!(v, "".to_owned());
2190

2191
        let mut decoder = Decoder::new(from_str("\"foo\"").unwrap());
S
Sean McArthur 已提交
2192
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2193
        assert_eq!(v, "foo".to_owned());
2194

2195
        let mut decoder = Decoder::new(from_str("\"\\\"\"").unwrap());
S
Sean McArthur 已提交
2196
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2197
        assert_eq!(v, "\"".to_owned());
2198

2199
        let mut decoder = Decoder::new(from_str("\"\\b\"").unwrap());
S
Sean McArthur 已提交
2200
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2201
        assert_eq!(v, "\x08".to_owned());
2202

2203
        let mut decoder = Decoder::new(from_str("\"\\n\"").unwrap());
S
Sean McArthur 已提交
2204
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2205
        assert_eq!(v, "\n".to_owned());
2206

2207
        let mut decoder = Decoder::new(from_str("\"\\r\"").unwrap());
S
Sean McArthur 已提交
2208
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2209
        assert_eq!(v, "\r".to_owned());
2210

2211
        let mut decoder = Decoder::new(from_str("\"\\t\"").unwrap());
S
Sean McArthur 已提交
2212
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2213
        assert_eq!(v, "\t".to_owned());
2214

2215
        let mut decoder = Decoder::new(from_str("\"\\u12ab\"").unwrap());
S
Sean McArthur 已提交
2216
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2217
        assert_eq!(v, "\u12ab".to_owned());
2218

2219
        let mut decoder = Decoder::new(from_str("\"\\uAB12\"").unwrap());
S
Sean McArthur 已提交
2220
        let v: ~str = Decodable::decode(&mut decoder).unwrap();
2221
        assert_eq!(v, "\uAB12".to_owned());
2222 2223
    }

2224
    #[test]
2225
    fn test_read_list() {
E
Erick Tryzelaar 已提交
2226
        assert_eq!(from_str("["),
2227
            Err(ParseError("EOF while parsing value".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2228
        assert_eq!(from_str("[1"),
2229
            Err(ParseError("EOF while parsing list".to_owned(), 1u, 3u)));
E
Erick Tryzelaar 已提交
2230
        assert_eq!(from_str("[1,"),
2231
            Err(ParseError("EOF while parsing value".to_owned(), 1u, 4u)));
E
Erick Tryzelaar 已提交
2232
        assert_eq!(from_str("[1,]"),
2233
            Err(ParseError("invalid syntax".to_owned(), 1u, 4u)));
E
Erick Tryzelaar 已提交
2234
        assert_eq!(from_str("[6 7]"),
2235
            Err(ParseError("expected `,` or `]`".to_owned(), 1u, 4u)));
2236

E
Erick Tryzelaar 已提交
2237 2238 2239 2240 2241 2242
        assert_eq!(from_str("[]"), Ok(List(~[])));
        assert_eq!(from_str("[ ]"), Ok(List(~[])));
        assert_eq!(from_str("[true]"), Ok(List(~[Boolean(true)])));
        assert_eq!(from_str("[ false ]"), Ok(List(~[Boolean(false)])));
        assert_eq!(from_str("[null]"), Ok(List(~[Null])));
        assert_eq!(from_str("[3, 1]"),
D
Daniel Micay 已提交
2243
                     Ok(List(~[Number(3.0), Number(1.0)])));
E
Erick Tryzelaar 已提交
2244
        assert_eq!(from_str("\n[3, 2]\n"),
D
Daniel Micay 已提交
2245
                     Ok(List(~[Number(3.0), Number(2.0)])));
E
Erick Tryzelaar 已提交
2246
        assert_eq!(from_str("[2, [4, 1]]"),
D
Daniel Micay 已提交
2247
               Ok(List(~[Number(2.0), List(~[Number(4.0), Number(1.0)])])));
2248 2249
    }

2250 2251
    #[test]
    fn test_decode_list() {
2252
        let mut decoder = Decoder::new(from_str("[]").unwrap());
S
Sean McArthur 已提交
2253
        let v: ~[()] = Decodable::decode(&mut decoder).unwrap();
2254 2255
        assert_eq!(v, ~[]);

2256
        let mut decoder = Decoder::new(from_str("[null]").unwrap());
S
Sean McArthur 已提交
2257
        let v: ~[()] = Decodable::decode(&mut decoder).unwrap();
2258 2259
        assert_eq!(v, ~[()]);

2260
        let mut decoder = Decoder::new(from_str("[true]").unwrap());
S
Sean McArthur 已提交
2261
        let v: ~[bool] = Decodable::decode(&mut decoder).unwrap();
2262 2263
        assert_eq!(v, ~[true]);

2264
        let mut decoder = Decoder::new(from_str("[true]").unwrap());
S
Sean McArthur 已提交
2265
        let v: ~[bool] = Decodable::decode(&mut decoder).unwrap();
2266 2267
        assert_eq!(v, ~[true]);

2268
        let mut decoder = Decoder::new(from_str("[3, 1]").unwrap());
S
Sean McArthur 已提交
2269
        let v: ~[int] = Decodable::decode(&mut decoder).unwrap();
2270 2271
        assert_eq!(v, ~[3, 1]);

2272
        let mut decoder = Decoder::new(from_str("[[3], [1, 2]]").unwrap());
S
Sean McArthur 已提交
2273
        let v: ~[~[uint]] = Decodable::decode(&mut decoder).unwrap();
2274 2275 2276
        assert_eq!(v, ~[~[3], ~[1, 2]]);
    }

2277
    #[test]
2278
    fn test_read_object() {
E
Erick Tryzelaar 已提交
2279
        assert_eq!(from_str("{"),
2280
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2281
        assert_eq!(from_str("{ "),
2282
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 3u)));
E
Erick Tryzelaar 已提交
2283
        assert_eq!(from_str("{1"),
2284
            Err(ParseError("key must be a string".to_owned(), 1u, 2u)));
E
Erick Tryzelaar 已提交
2285
        assert_eq!(from_str("{ \"a\""),
2286
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 6u)));
E
Erick Tryzelaar 已提交
2287
        assert_eq!(from_str("{\"a\""),
2288
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 5u)));
E
Erick Tryzelaar 已提交
2289
        assert_eq!(from_str("{\"a\" "),
2290
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 6u)));
2291

E
Erick Tryzelaar 已提交
2292
        assert_eq!(from_str("{\"a\" 1"),
2293
            Err(ParseError("expected `:`".to_owned(), 1u, 6u)));
E
Erick Tryzelaar 已提交
2294
        assert_eq!(from_str("{\"a\":"),
2295
            Err(ParseError("EOF while parsing value".to_owned(), 1u, 6u)));
E
Erick Tryzelaar 已提交
2296
        assert_eq!(from_str("{\"a\":1"),
2297
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 7u)));
E
Erick Tryzelaar 已提交
2298
        assert_eq!(from_str("{\"a\":1 1"),
2299
            Err(ParseError("expected `,` or `}`".to_owned(), 1u, 8u)));
E
Erick Tryzelaar 已提交
2300
        assert_eq!(from_str("{\"a\":1,"),
2301
            Err(ParseError("EOF while parsing object".to_owned(), 1u, 8u)));
2302

E
Erick Tryzelaar 已提交
2303 2304
        assert_eq!(from_str("{}").unwrap(), mk_object([]));
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
2305
                  mk_object([("a".to_owned(), Number(3.0))]));
2306

E
Erick Tryzelaar 已提交
2307 2308
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
E
Erick Tryzelaar 已提交
2309
                  mk_object([
2310 2311
                      ("a".to_owned(), Null),
                      ("b".to_owned(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2312
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
E
Erick Tryzelaar 已提交
2313
                  mk_object([
2314 2315
                      ("a".to_owned(), Null),
                      ("b".to_owned(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2316 2317
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
E
Erick Tryzelaar 已提交
2318
                  mk_object([
2319 2320
                      ("a".to_owned(), Number(1.0)),
                      ("b".to_owned(), List(~[Boolean(true)]))
2321
                  ]));
E
Erick Tryzelaar 已提交
2322
        assert_eq!(from_str(
2323
                      "{".to_owned() +
2324 2325 2326 2327 2328 2329
                          "\"a\": 1.0, " +
                          "\"b\": [" +
                              "true," +
                              "\"foo\\nbar\", " +
                              "{ \"c\": {\"d\": null} } " +
                          "]" +
E
Erick Tryzelaar 已提交
2330
                      "}").unwrap(),
E
Erick Tryzelaar 已提交
2331
                  mk_object([
2332 2333
                      ("a".to_owned(), Number(1.0)),
                      ("b".to_owned(), List(~[
B
Ben Striegel 已提交
2334
                          Boolean(true),
2335
                          String("foo\nbar".to_owned()),
E
Erick Tryzelaar 已提交
2336
                          mk_object([
2337
                              ("c".to_owned(), mk_object([("d".to_owned(), Null)]))
2338 2339
                          ])
                      ]))
2340
                  ]));
2341 2342
    }

2343
    #[test]
2344
    fn test_decode_struct() {
2345
        let s = "{
2346 2347 2348
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
2349
        }".to_owned();
2350
        let mut decoder = Decoder::new(from_str(s).unwrap());
S
Sean McArthur 已提交
2351
        let v: Outer = Decodable::decode(&mut decoder).unwrap();
2352 2353 2354 2355
        assert_eq!(
            v,
            Outer {
                inner: ~[
2356
                    Inner { a: (), b: 2, c: ~["abc".to_owned(), "xyz".to_owned()] }
2357 2358 2359 2360 2361 2362 2363
                ]
            }
        );
    }

    #[test]
    fn test_decode_option() {
2364
        let mut decoder = Decoder::new(from_str("null").unwrap());
S
Sean McArthur 已提交
2365
        let value: Option<~str> = Decodable::decode(&mut decoder).unwrap();
2366 2367
        assert_eq!(value, None);

2368
        let mut decoder = Decoder::new(from_str("\"jodhpurs\"").unwrap());
S
Sean McArthur 已提交
2369
        let value: Option<~str> = Decodable::decode(&mut decoder).unwrap();
2370
        assert_eq!(value, Some("jodhpurs".to_owned()));
2371 2372
    }

2373
    #[test]
2374
    fn test_decode_enum() {
2375
        let mut decoder = Decoder::new(from_str("\"Dog\"").unwrap());
S
Sean McArthur 已提交
2376
        let value: Animal = Decodable::decode(&mut decoder).unwrap();
2377 2378
        assert_eq!(value, Dog);

2379
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
2380
        let mut decoder = Decoder::new(from_str(s).unwrap());
S
Sean McArthur 已提交
2381
        let value: Animal = Decodable::decode(&mut decoder).unwrap();
2382
        assert_eq!(value, Frog("Henry".to_owned(), 349));
2383 2384
    }

2385
    #[test]
2386
    fn test_decode_map() {
2387 2388
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
                  \"fields\":[\"Henry\", 349]}}".to_owned();
2389
        let mut decoder = Decoder::new(from_str(s).unwrap());
S
Sean McArthur 已提交
2390
        let mut map: TreeMap<~str, Animal> = Decodable::decode(&mut decoder).unwrap();
2391

2392 2393
        assert_eq!(map.pop(&"a".to_owned()), Some(Dog));
        assert_eq!(map.pop(&"b".to_owned()), Some(Frog("Henry".to_owned(), 349)));
2394 2395
    }

2396
    #[test]
2397
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
2398
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
2399
            Err(ParseError("EOF while parsing object".to_owned(), 3u, 8u)));
2400
    }
2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413

    #[deriving(Decodable)]
    struct DecodeStruct {
        x: f64,
        y: bool,
        z: ~str,
        w: ~[DecodeStruct]
    }
    #[deriving(Decodable)]
    enum DecodeEnum {
        A(f64),
        B(~str)
    }
S
Sean McArthur 已提交
2414 2415 2416 2417 2418
    fn check_err<T: Decodable<Decoder, Error>>(to_parse: &'static str, expected: Error) {
        let res: DecodeResult<T> = match from_str(to_parse) {
            Err(e) => Err(e),
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
2419
        match res {
S
Sean McArthur 已提交
2420 2421 2422 2423
            Ok(_) => fail!("`{}` parsed & decoded ok, expecting error `{}`",
                              to_parse, expected),
            Err(ParseError(e, _, _)) => fail!("`{}` is not valid json: {}",
                                           to_parse, e),
2424
            Err(e) => {
S
Sean McArthur 已提交
2425
                assert_eq!(e, expected);
2426
            }
S
Sean McArthur 已提交
2427

2428 2429 2430 2431
        }
    }
    #[test]
    fn test_decode_errors_struct() {
2432
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_owned(), "[]".to_owned()));
2433
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
2434
                                  ExpectedError("Number".to_owned(), "true".to_owned()));
2435
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
2436
                                  ExpectedError("Boolean".to_owned(), "[]".to_owned()));
2437
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
2438
                                  ExpectedError("String".to_owned(), "{}".to_owned()));
2439
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
2440
                                  ExpectedError("List".to_owned(), "null".to_owned()));
2441
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
2442
                                  MissingFieldError("w".to_owned()));
2443 2444 2445 2446
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
2447
                                MissingFieldError("variant".to_owned()));
2448
        check_err::<DecodeEnum>("{\"variant\": 1}",
2449
                                ExpectedError("String".to_owned(), "1".to_owned()));
2450
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
2451
                                MissingFieldError("fields".to_owned()));
2452
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
2453
                                ExpectedError("List".to_owned(), "null".to_owned()));
2454
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
2455
                                UnknownVariantError("C".to_owned()));
2456
    }
2457 2458 2459 2460

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
2461
        let found_str = json_value.find(&"dog".to_owned());
2462
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == &"cat");
2463 2464 2465 2466 2467
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2468 2469
        let found_str = json_value.find_path(&[&"dog".to_owned(),
                                             &"cat".to_owned(), &"mouse".to_owned()]);
2470
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == &"cheese");
2471 2472 2473 2474 2475
    }

    #[test]
    fn test_search(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2476
        let found_str = json_value.search(&"mouse".to_owned()).and_then(|j| j.as_string());
2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508
        assert!(found_str.is_some());
        assert!(found_str.unwrap() == &"cheese");
    }

    #[test]
    fn test_is_object(){
        let json_value = from_str("{}").unwrap();
        assert!(json_value.is_object());
    }

    #[test]
    fn test_as_object(){
        let json_value = from_str("{}").unwrap();
        let json_object = json_value.as_object();
        assert!(json_object.is_some());
    }

    #[test]
    fn test_is_list(){
        let json_value = from_str("[1, 2, 3]").unwrap();
        assert!(json_value.is_list());
    }

    #[test]
    fn test_as_list(){
        let json_value = from_str("[1, 2, 3]").unwrap();
        let json_list = json_value.as_list();
        let expected_length = 3;
        assert!(json_list.is_some() && json_list.unwrap().len() == expected_length);
    }

    #[test]
2509
    fn test_is_string(){
2510
        let json_value = from_str("\"dog\"").unwrap();
2511
        assert!(json_value.is_string());
2512 2513 2514
    }

    #[test]
2515
    fn test_as_string(){
2516
        let json_value = from_str("\"dog\"").unwrap();
2517
        let json_str = json_value.as_string();
2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562
        let expected_str = &"dog";
        assert_eq!(json_str, Some(expected_str));
    }

    #[test]
    fn test_is_number(){
        let json_value = from_str("12").unwrap();
        assert!(json_value.is_number());
    }

    #[test]
    fn test_as_number(){
        let json_value = from_str("12").unwrap();
        let json_num = json_value.as_number();
        let expected_num = 12f64;
        assert!(json_num.is_some() && json_num.unwrap() == expected_num);
    }

    #[test]
    fn test_is_boolean(){
        let json_value = from_str("false").unwrap();
        assert!(json_value.is_boolean());
    }

    #[test]
    fn test_as_boolean(){
        let json_value = from_str("false").unwrap();
        let json_bool = json_value.as_boolean();
        let expected_bool = false;
        assert!(json_bool.is_some() && json_bool.unwrap() == expected_bool);
    }

    #[test]
    fn test_is_null(){
        let json_value = from_str("null").unwrap();
        assert!(json_value.is_null());
    }

    #[test]
    fn test_as_null(){
        let json_value = from_str("null").unwrap();
        let json_null = json_value.as_null();
        let expected_null = ();
        assert!(json_null.is_some() && json_null.unwrap() == expected_null);
    }
2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
        use collections::HashMap;
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
        let mut mem_buf = MemWriter::new();
        {
            let mut encoder = Encoder::new(&mut mem_buf as &mut io::Writer);
S
Sean McArthur 已提交
2575
            hm.encode(&mut encoder).unwrap();
2576 2577
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2578
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594
        match from_str(json_str) {
            Err(_) => fail!("Unable to parse json_str: {:?}", json_str),
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_prettyencode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
        use collections::HashMap;
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
        let mut mem_buf = MemWriter::new();
        {
            let mut encoder = PrettyEncoder::new(&mut mem_buf as &mut io::Writer);
S
Sean McArthur 已提交
2595
            hm.encode(&mut encoder).unwrap();
2596 2597
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2598
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613
        match from_str(json_str) {
            Err(_) => fail!("Unable to parse json_str: {:?}", json_str),
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
        use collections::HashMap;
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
            Err(_) => fail!("Unable to parse json_str: {:?}", json_str),
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
2614
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
2615
    }
2616
}