summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/de/parse.rs6
-rw-r--r--tests/test_deserialize.rs19
2 files changed, 23 insertions, 2 deletions
diff --git a/src/de/parse.rs b/src/de/parse.rs
index b9f2b35..e015d94 100644
--- a/src/de/parse.rs
+++ b/src/de/parse.rs
@@ -346,7 +346,7 @@ impl<I: Iterator<Item = u8>> Parser<I> {
},
b'[' => {
if let Level::Invalid(_) = *node {
- *node = Level::Nested(BTreeMap::default());
+ *node = Level::OrderedSeq(BTreeMap::default());
}
if let Level::OrderedSeq(ref mut map) = *node {
self.depth -= 1;
@@ -398,7 +398,7 @@ impl<I: Iterator<Item = u8>> Parser<I> {
},
// First character is an integer, attempt to parse it as an integer key
- 0x30...0x39 => {
+ b'0'...b'9' => {
let key = self.parse_key(b']', true)?;
let key = usize::from_str_radix(&key, 10).map_err(Error::from)?;
self.parse_ord_seq_value(key, node)?;
@@ -419,6 +419,8 @@ impl<I: Iterator<Item = u8>> Parser<I> {
},
// This means the key should be a root key
// of the form "abc" or "abc[...]"
+ // We do actually allow integer keys here since they cannot
+ // be confused with sequences
0x20...0x5a | 0x5c...0x7e => {
let key = self.parse_key(b'[', false)?;
self.parse_map_value(key, node)?;
diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs
index 20a573c..6d5cc9b 100644
--- a/tests/test_deserialize.rs
+++ b/tests/test_deserialize.rs
@@ -360,3 +360,22 @@ fn deserialize_enum() {
let rec_params: E = qs::from_str(params).unwrap();
assert_eq!(rec_params, E::S("Hello World".to_string()));
}
+
+#[test]
+fn seq_of_struct() {
+
+ #[derive(Deserialize, Debug, PartialEq)]
+ struct Test {
+ a: u8
+ }
+ #[derive(Deserialize, Debug, PartialEq)]
+ struct Query {
+ b: Vec<Test>,
+ }
+
+ let params = "b[0][a]=1&b[1][a]=2";
+ let rec_params: Query = qs::from_str(params).unwrap();
+ assert_eq!(rec_params,
+ Query { b: vec![Test { a: 1 }, Test { a: 2 }] }
+ );
+} \ No newline at end of file