mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-12 21:21:02 +00:00
Support json deserialization
This commit is contained in:
+51
-54
@@ -10,8 +10,8 @@ use super::error::{Error, ErrorCode};
|
|||||||
pub struct Parser<Iter> {
|
pub struct Parser<Iter> {
|
||||||
rdr: Iter,
|
rdr: Iter,
|
||||||
ch: Option<u8>,
|
ch: Option<u8>,
|
||||||
line: uint,
|
line: usize,
|
||||||
col: uint,
|
col: usize,
|
||||||
buf: Vec<u8>,
|
buf: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,9 +82,8 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn parse_value<
|
fn parse_value<
|
||||||
R,
|
V: de::Visitor,
|
||||||
V: de::Visitor<Parser<Iter>, R, Error>,
|
>(&mut self, visitor: &mut V) -> Result<V::Value, Error> {
|
||||||
>(&mut self, visitor: &mut V) -> Result<R, Error> {
|
|
||||||
self.parse_whitespace();
|
self.parse_whitespace();
|
||||||
|
|
||||||
if self.eof() {
|
if self.eof() {
|
||||||
@@ -94,7 +93,7 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
match self.ch_or_null() {
|
match self.ch_or_null() {
|
||||||
b'n' => {
|
b'n' => {
|
||||||
try!(self.parse_ident(b"ull"));
|
try!(self.parse_ident(b"ull"));
|
||||||
visitor.visit_null()
|
visitor.visit_unit()
|
||||||
}
|
}
|
||||||
b't' => {
|
b't' => {
|
||||||
try!(self.parse_ident(b"rue"));
|
try!(self.parse_ident(b"rue"));
|
||||||
@@ -107,7 +106,6 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
b'0' ... b'9' | b'-' => self.parse_number(visitor),
|
b'0' ... b'9' | b'-' => self.parse_number(visitor),
|
||||||
b'"' => {
|
b'"' => {
|
||||||
try!(self.parse_string());
|
try!(self.parse_string());
|
||||||
//let s = String::from_utf8(self.buf.clone()).unwrap();
|
|
||||||
let s = str::from_utf8(self.buf.as_slice()).unwrap();
|
let s = str::from_utf8(self.buf.as_slice()).unwrap();
|
||||||
visitor.visit_str(s)
|
visitor.visit_str(s)
|
||||||
}
|
}
|
||||||
@@ -137,9 +135,8 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn parse_number<
|
fn parse_number<
|
||||||
R,
|
V: de::Visitor,
|
||||||
V: de::Visitor<Parser<Iter>, R, Error>,
|
>(&mut self, visitor: &mut V) -> Result<V::Value, Error> {
|
||||||
>(&mut self, visitor: &mut V) -> Result<R, Error> {
|
|
||||||
let mut neg = 1;
|
let mut neg = 1;
|
||||||
|
|
||||||
if self.ch_is(b'-') {
|
if self.ch_is(b'-') {
|
||||||
@@ -217,7 +214,7 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
match self.ch_or_null() {
|
match self.ch_or_null() {
|
||||||
c @ b'0' ... b'9' => {
|
c @ b'0' ... b'9' => {
|
||||||
dec /= 10.0;
|
dec /= 10.0;
|
||||||
res += (((c as int) - (b'0' as int)) as f64) * dec;
|
res += (((c as u64) - (b'0' as u64)) as f64) * dec;
|
||||||
self.bump();
|
self.bump();
|
||||||
}
|
}
|
||||||
_ => break,
|
_ => break,
|
||||||
@@ -231,7 +228,7 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
fn parse_exponent(&mut self, mut res: f64) -> Result<f64, Error> {
|
fn parse_exponent(&mut self, mut res: f64) -> Result<f64, Error> {
|
||||||
self.bump();
|
self.bump();
|
||||||
|
|
||||||
let mut exp = 0u;
|
let mut exp = 0;
|
||||||
let mut neg_exp = false;
|
let mut neg_exp = false;
|
||||||
|
|
||||||
if self.ch_is(b'+') {
|
if self.ch_is(b'+') {
|
||||||
@@ -250,7 +247,7 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
match self.ch_or_null() {
|
match self.ch_or_null() {
|
||||||
c @ b'0' ... b'9' => {
|
c @ b'0' ... b'9' => {
|
||||||
exp *= 10;
|
exp *= 10;
|
||||||
exp += (c as uint) - (b'0' as uint);
|
exp += (c as i32) - (b'0' as i32);
|
||||||
|
|
||||||
self.bump();
|
self.bump();
|
||||||
}
|
}
|
||||||
@@ -258,7 +255,7 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let exp: f64 = 10_f64.powi(exp as i32);
|
let exp: f64 = 10_f64.powi(exp);
|
||||||
if neg_exp {
|
if neg_exp {
|
||||||
res /= exp;
|
res /= exp;
|
||||||
} else {
|
} else {
|
||||||
@@ -270,9 +267,9 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn decode_hex_escape(&mut self) -> Result<u16, Error> {
|
fn decode_hex_escape(&mut self) -> Result<u16, Error> {
|
||||||
let mut i = 0u;
|
let mut i = 0;
|
||||||
let mut n = 0u16;
|
let mut n = 0u16;
|
||||||
while i < 4u && !self.eof() {
|
while i < 4 && !self.eof() {
|
||||||
self.bump();
|
self.bump();
|
||||||
n = match self.ch_or_null() {
|
n = match self.ch_or_null() {
|
||||||
c @ b'0' ... b'9' => n * 16_u16 + ((c as u16) - (b'0' as u16)),
|
c @ b'0' ... b'9' => n * 16_u16 + ((c as u16) - (b'0' as u16)),
|
||||||
@@ -285,11 +282,11 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
_ => { return Err(self.error(ErrorCode::InvalidEscape)); }
|
_ => { return Err(self.error(ErrorCode::InvalidEscape)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
i += 1u;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error out if we didn't parse 4 digits.
|
// Error out if we didn't parse 4 digits.
|
||||||
if i != 4u {
|
if i != 4 {
|
||||||
return Err(self.error(ErrorCode::InvalidEscape));
|
return Err(self.error(ErrorCode::InvalidEscape));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,12 +377,13 @@ impl<Iter: Iterator<Item=u8>> Parser<Iter> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Iter: Iterator<Item=u8>> Deserializer<Error> for Parser<Iter> {
|
impl<Iter: Iterator<Item=u8>> Deserializer for Parser<Iter> {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit<
|
fn visit<
|
||||||
R,
|
V: de::Visitor,
|
||||||
V: de::Visitor<Parser<Iter>, R, Error>,
|
>(&mut self, visitor: &mut V) -> Result<V::Value, Error> {
|
||||||
>(&mut self, visitor: &mut V) -> Result<R, Error> {
|
|
||||||
self.parse_value(visitor)
|
self.parse_value(visitor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -395,9 +393,11 @@ struct SeqVisitor<'a, Iter: 'a> {
|
|||||||
first: bool,
|
first: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Iter: Iterator<Item=u8>> de::SeqVisitor<Parser<Iter>, Error> for SeqVisitor<'a, Iter> {
|
impl<'a, Iter: Iterator<Item=u8>> de::SeqVisitor for SeqVisitor<'a, Iter> {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
fn visit<
|
fn visit<
|
||||||
T: de::Deserialize<Parser<Iter>, Error>,
|
T: de::Deserialize,
|
||||||
>(&mut self) -> Result<Option<T>, Error> {
|
>(&mut self) -> Result<Option<T>, Error> {
|
||||||
self.parser.parse_whitespace();
|
self.parser.parse_whitespace();
|
||||||
|
|
||||||
@@ -439,9 +439,11 @@ struct MapVisitor<'a, Iter: 'a> {
|
|||||||
first: bool,
|
first: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Iter: Iterator<Item=u8>> de::MapVisitor<Parser<Iter>, Error> for MapVisitor<'a, Iter> {
|
impl<'a, Iter: Iterator<Item=u8>> de::MapVisitor for MapVisitor<'a, Iter> {
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
fn visit_key<
|
fn visit_key<
|
||||||
K: de::Deserialize<Parser<Iter>, Error>,
|
K: de::Deserialize,
|
||||||
>(&mut self) -> Result<Option<K>, Error> {
|
>(&mut self) -> Result<Option<K>, Error> {
|
||||||
self.parser.parse_whitespace();
|
self.parser.parse_whitespace();
|
||||||
|
|
||||||
@@ -475,7 +477,7 @@ impl<'a, Iter: Iterator<Item=u8>> de::MapVisitor<Parser<Iter>, Error> for MapVis
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_value<
|
fn visit_value<
|
||||||
V: de::Deserialize<Parser<Iter>, Error>,
|
V: de::Deserialize,
|
||||||
>(&mut self) -> Result<V, Error> {
|
>(&mut self) -> Result<V, Error> {
|
||||||
self.parser.parse_whitespace();
|
self.parser.parse_whitespace();
|
||||||
|
|
||||||
@@ -505,10 +507,10 @@ impl<'a, Iter: Iterator<Item=u8>> de::MapVisitor<Parser<Iter>, Error> for MapVis
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Decodes a json value from an `Iterator<u8>`.
|
/// Decodes a json value from an `Iterator<u8>`.
|
||||||
pub fn from_iter<
|
pub fn from_iter<I, T>(iter: I) -> Result<T, Error>
|
||||||
Iter: Iterator<Item=u8>,
|
where I: Iterator<Item=u8>,
|
||||||
T: de::Deserialize<Parser<Iter>, Error>
|
T: de::Deserialize
|
||||||
>(iter: Iter) -> Result<T, Error> {
|
{
|
||||||
let mut parser = Parser::new(iter);
|
let mut parser = Parser::new(iter);
|
||||||
let value = try!(de::Deserialize::deserialize(&mut parser));
|
let value = try!(de::Deserialize::deserialize(&mut parser));
|
||||||
|
|
||||||
@@ -518,14 +520,12 @@ pub fn from_iter<
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Decodes a json value from a string
|
/// Decodes a json value from a string
|
||||||
pub fn from_str<
|
pub fn from_str<'a, T>(s: &'a str) -> Result<T, Error>
|
||||||
'a,
|
where T: de::Deserialize
|
||||||
T: de::Deserialize<Parser<str::Bytes<'a>>, Error>
|
{
|
||||||
>(s: &'a str) -> Result<T, Error> {
|
|
||||||
from_iter(s.bytes())
|
from_iter(s.bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::str;
|
use std::str;
|
||||||
@@ -544,10 +544,9 @@ mod tests {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_parse_ok<
|
fn test_parse_ok<'a, T>(errors: Vec<(&'a str, T)>)
|
||||||
'a,
|
where T: PartialEq + Show + Deserialize,
|
||||||
T: PartialEq + Show + Deserialize<Parser<str::Bytes<'a>>, Error>,
|
{
|
||||||
>(errors: Vec<(&'a str, T)>) {
|
|
||||||
for (s, value) in errors.into_iter() {
|
for (s, value) in errors.into_iter() {
|
||||||
let v: Result<T, Error> = from_str(s);
|
let v: Result<T, Error> = from_str(s);
|
||||||
assert_eq!(v, Ok(value));
|
assert_eq!(v, Ok(value));
|
||||||
@@ -559,10 +558,9 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_parse_err<
|
fn test_parse_err<'a, T>(errors: Vec<(&'a str, Error)>)
|
||||||
'a,
|
where T: PartialEq + Show + Deserialize
|
||||||
T: PartialEq + Show + Deserialize<Parser<str::Bytes<'a>>, Error>
|
{
|
||||||
>(errors: Vec<(&'a str, Error)>) {
|
|
||||||
for (s, err) in errors.into_iter() {
|
for (s, err) in errors.into_iter() {
|
||||||
let v: Result<T, Error> = from_str(s);
|
let v: Result<T, Error> = from_str(s);
|
||||||
assert_eq!(v, Err(err));
|
assert_eq!(v, Err(err));
|
||||||
@@ -668,12 +666,12 @@ mod tests {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
test_parse_ok(vec![
|
test_parse_ok(vec![
|
||||||
("[3,1]", vec![3i, 1]),
|
("[3,1]", vec![3, 1]),
|
||||||
("[ 3 , 1 ]", vec![3i, 1]),
|
("[ 3 , 1 ]", vec![3, 1]),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
test_parse_ok(vec![
|
test_parse_ok(vec![
|
||||||
("[[3], [1, 2]]", vec![vec![3i], vec![1, 2]]),
|
("[[3], [1, 2]]", vec![vec![3], vec![1, 2]]),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
test_parse_ok(vec![
|
test_parse_ok(vec![
|
||||||
@@ -695,7 +693,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_object() {
|
fn test_parse_object() {
|
||||||
test_parse_err::<BTreeMap<String, int>>(vec![
|
test_parse_err::<BTreeMap<String, i32>>(vec![
|
||||||
("{", Error::SyntaxError(ErrorCode::EOFWhileParsingValue, 1, 2)),
|
("{", Error::SyntaxError(ErrorCode::EOFWhileParsingValue, 1, 2)),
|
||||||
("{ ", Error::SyntaxError(ErrorCode::EOFWhileParsingValue, 1, 3)),
|
("{ ", Error::SyntaxError(ErrorCode::EOFWhileParsingValue, 1, 3)),
|
||||||
("{1", Error::SyntaxError(ErrorCode::KeyMustBeAString, 1, 2)),
|
("{1", Error::SyntaxError(ErrorCode::KeyMustBeAString, 1, 2)),
|
||||||
@@ -715,28 +713,27 @@ mod tests {
|
|||||||
("{ }", treemap!()),
|
("{ }", treemap!()),
|
||||||
(
|
(
|
||||||
"{\"a\":3}",
|
"{\"a\":3}",
|
||||||
treemap!("a".to_string() => 3i)
|
treemap!("a".to_string() => 3)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"{ \"a\" : 3 }",
|
"{ \"a\" : 3 }",
|
||||||
treemap!("a".to_string() => 3i)
|
treemap!("a".to_string() => 3)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"{\"a\":3,\"b\":4}",
|
"{\"a\":3,\"b\":4}",
|
||||||
treemap!("a".to_string() => 3i, "b".to_string() => 4)
|
treemap!("a".to_string() => 3, "b".to_string() => 4)
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"{ \"a\" : 3 , \"b\" : 4 }",
|
"{ \"a\" : 3 , \"b\" : 4 }",
|
||||||
treemap!("a".to_string() => 3i, "b".to_string() => 4),
|
treemap!("a".to_string() => 3, "b".to_string() => 4),
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
test_parse_ok(vec![
|
test_parse_ok(vec![
|
||||||
(
|
(
|
||||||
"{\"a\": {\"b\": 3, \"c\": 4}}",
|
"{\"a\": {\"b\": 3, \"c\": 4}}",
|
||||||
treemap!("a".to_string() => treemap!("b".to_string() => 3i, "c".to_string() => 4i)),
|
treemap!("a".to_string() => treemap!("b".to_string() => 3, "c".to_string() => 4)),
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ pub use self::de::from_str;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
pub mod builder;
|
pub mod builder;
|
||||||
pub mod de;
|
|
||||||
*/
|
*/
|
||||||
|
pub mod de;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod ser;
|
pub mod ser;
|
||||||
//pub mod value;
|
//pub mod value;
|
||||||
|
|||||||
Reference in New Issue
Block a user