mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-21 05:01:04 +00:00
Fix serializing json enums
This commit is contained in:
+40
-6
@@ -47,12 +47,6 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
|||||||
type Value = ();
|
type Value = ();
|
||||||
type Error = io::Error;
|
type Error = io::Error;
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn visit_unit(&mut self) -> io::Result<()> {
|
|
||||||
try!(self.writer.write(b"null"));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_bool(&mut self, value: bool) -> io::Result<()> {
|
fn visit_bool(&mut self, value: bool) -> io::Result<()> {
|
||||||
if value {
|
if value {
|
||||||
@@ -145,6 +139,20 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
|||||||
value.visit(self)
|
value.visit(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn visit_unit(&mut self) -> io::Result<()> {
|
||||||
|
try!(self.writer.write(b"null"));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn visit_enum_unit(&mut self, _name: &str, variant: &str) -> io::Result<()> {
|
||||||
|
try!(self.writer.write(b"{"));
|
||||||
|
try!(self.visit_str(variant));
|
||||||
|
try!(self.writer.write(b":[]}"));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_seq<V>(&mut self, mut visitor: V) -> io::Result<()>
|
fn visit_seq<V>(&mut self, mut visitor: V) -> io::Result<()>
|
||||||
where V: ser::SeqVisitor,
|
where V: ser::SeqVisitor,
|
||||||
@@ -157,6 +165,19 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn visit_enum_seq<V>(&mut self, _name: &str, variant: &str, visitor: V) -> io::Result<()>
|
||||||
|
where V: ser::SeqVisitor,
|
||||||
|
{
|
||||||
|
try!(self.writer.write(b"{"));
|
||||||
|
try!(self.visit_str(variant));
|
||||||
|
try!(self.writer.write(b":"));
|
||||||
|
try!(self.visit_seq(visitor));
|
||||||
|
try!(self.writer.write(b"}"));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_seq_elt<T>(&mut self, first: bool, value: T) -> io::Result<()>
|
fn visit_seq_elt<T>(&mut self, first: bool, value: T) -> io::Result<()>
|
||||||
where T: ser::Serialize,
|
where T: ser::Serialize,
|
||||||
@@ -181,6 +202,19 @@ impl<'a, W: io::Write> ser::Visitor for Visitor<'a, W> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn visit_enum_map<V>(&mut self, _name: &str, variant: &str, visitor: V) -> io::Result<()>
|
||||||
|
where V: ser::MapVisitor,
|
||||||
|
{
|
||||||
|
try!(self.writer.write(b"{"));
|
||||||
|
try!(self.visit_str(variant));
|
||||||
|
try!(self.writer.write(b":"));
|
||||||
|
try!(self.visit_map(visitor));
|
||||||
|
try!(self.writer.write(b"}"));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_map_elt<K, V>(&mut self, first: bool, key: K, value: V) -> io::Result<()>
|
fn visit_map_elt<K, V>(&mut self, first: bool, key: K, value: V) -> io::Result<()>
|
||||||
where K: ser::Serialize,
|
where K: ser::Serialize,
|
||||||
|
|||||||
@@ -193,6 +193,26 @@ impl ser::Visitor for Serializer {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn visit_enum_seq<V>(&mut self, _name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
||||||
|
where V: ser::SeqVisitor,
|
||||||
|
{
|
||||||
|
try!(self.visit_seq(visitor));
|
||||||
|
|
||||||
|
let value = match self.state.pop().unwrap() {
|
||||||
|
State::Value(value) => value,
|
||||||
|
_ => panic!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut object = BTreeMap::new();
|
||||||
|
|
||||||
|
object.insert(variant.to_string(), value);
|
||||||
|
|
||||||
|
self.state.push(State::Value(Value::Object(object)));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_seq_elt<T>(&mut self, _first: bool, value: T) -> Result<(), ()>
|
fn visit_seq_elt<T>(&mut self, _first: bool, value: T) -> Result<(), ()>
|
||||||
where T: ser::Serialize,
|
where T: ser::Serialize,
|
||||||
@@ -232,6 +252,26 @@ impl ser::Visitor for Serializer {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn visit_enum_map<V>(&mut self, _name: &str, variant: &str, visitor: V) -> Result<(), ()>
|
||||||
|
where V: ser::MapVisitor,
|
||||||
|
{
|
||||||
|
try!(self.visit_map(visitor));
|
||||||
|
|
||||||
|
let value = match self.state.pop().unwrap() {
|
||||||
|
State::Value(value) => value,
|
||||||
|
_ => panic!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut object = BTreeMap::new();
|
||||||
|
|
||||||
|
object.insert(variant.to_string(), value);
|
||||||
|
|
||||||
|
self.state.push(State::Value(Value::Object(object)));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn visit_map_elt<K, V>(&mut self, _first: bool, key: K, value: V) -> Result<(), ()>
|
fn visit_map_elt<K, V>(&mut self, _first: bool, key: K, value: V) -> Result<(), ()>
|
||||||
where K: ser::Serialize,
|
where K: ser::Serialize,
|
||||||
|
|||||||
@@ -54,7 +54,9 @@ macro_rules! treemap {
|
|||||||
#[derive_deserialize]
|
#[derive_deserialize]
|
||||||
enum Animal {
|
enum Animal {
|
||||||
Dog,
|
Dog,
|
||||||
Frog(String, Vec<isize>)
|
Frog(String, Vec<isize>),
|
||||||
|
Cat { age: usize, name: String },
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
#[derive(PartialEq, Debug)]
|
||||||
@@ -349,10 +351,26 @@ fn test_write_tuple() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_write_enum() {
|
fn test_write_enum() {
|
||||||
test_encode_ok(&[
|
test_encode_ok(&[
|
||||||
(Animal::Dog, "{\"Dog\":[]}"),
|
(
|
||||||
(Animal::Frog("Henry".to_string(), vec!()), "{\"Frog\":[\"Henry\",[]]}"),
|
Animal::Dog,
|
||||||
(Animal::Frog("Henry".to_string(), vec!(349)), "{\"Frog\":[\"Henry\",[349]]}"),
|
"{\"Dog\":[]}",
|
||||||
(Animal::Frog("Henry".to_string(), vec!(349, 102)), "{\"Frog\":[\"Henry\",[349,102]]}"),
|
),
|
||||||
|
(
|
||||||
|
Animal::Frog("Henry".to_string(), vec!()),
|
||||||
|
"{\"Frog\":[\"Henry\",[]]}",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Animal::Frog("Henry".to_string(), vec!(349)),
|
||||||
|
"{\"Frog\":[\"Henry\",[349]]}",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Animal::Frog("Henry".to_string(), vec!(349, 102)),
|
||||||
|
"{\"Frog\":[\"Henry\",[349,102]]}",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Animal::Cat { age: 5, name: "Kate".to_string() },
|
||||||
|
"{\"Cat\":{\"age\":5,\"name\":\"Kate\"}}"
|
||||||
|
),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user