@@ -68,7 +68,10 @@ pub use self::owned::{
6868 to_value_with_buffers as to_owned_value_with_buffers,
6969} ;
7070use crate :: { Buffers , Deserializer , Result } ;
71+ #[ cfg( not( feature = "preserve_order" ) ) ]
7172use halfbrown:: HashMap ;
73+ #[ cfg( feature = "preserve_order" ) ]
74+ use indexmap:: IndexMap ;
7275use std:: hash:: Hash ;
7376use std:: marker:: PhantomData ;
7477use tape:: Node ;
@@ -78,8 +81,18 @@ pub use value_trait::*;
7881#[ cfg( feature = "known-key" ) ]
7982pub type ObjectHasher = crate :: known_key:: NotSoRandomState ;
8083/// Hasher used for objects
81- #[ cfg( not( feature = "known-key" ) ) ]
84+ #[ cfg( all ( not( feature = "known-key" ) , not ( feature = "preserve_order" ) ) ) ]
8285pub type ObjectHasher = halfbrown:: DefaultHashBuilder ;
86+ /// Hasher used for objects
87+ #[ cfg( all( not( feature = "known-key" ) , feature = "preserve_order" ) ) ]
88+ pub type ObjectHasher = std:: hash:: RandomState ;
89+
90+ /// Hashmap used for objects
91+ #[ cfg( not( feature = "preserve_order" ) ) ]
92+ type ObjectMap < K , V > = HashMap < K , V , ObjectHasher > ;
93+ /// Hashmap used for objects
94+ #[ cfg( feature = "preserve_order" ) ]
95+ type ObjectMap < K , V > = IndexMap < K , V , ObjectHasher > ;
8396
8497/// Parses a slice of bytes into a Value dom.
8598///
@@ -92,7 +105,7 @@ pub type ObjectHasher = halfbrown::DefaultHashBuilder;
92105/// Will return `Err` if `s` is invalid JSON.
93106pub fn deserialize < ' de , Value , Key > ( s : & ' de mut [ u8 ] ) -> Result < Value >
94107where
95- Value : ValueBuilder < ' de > + From < Vec < Value > > + From < HashMap < Key , Value , ObjectHasher > > + ' de ,
108+ Value : ValueBuilder < ' de > + From < Vec < Value > > + From < ObjectMap < Key , Value > > + ' de ,
96109 Key : Hash + Eq + From < & ' de str > ,
97110{
98111 match Deserializer :: from_slice ( s) {
@@ -117,7 +130,7 @@ pub fn deserialize_with_buffers<'de, Value, Key>(
117130 buffers : & mut Buffers ,
118131) -> Result < Value >
119132where
120- Value : ValueBuilder < ' de > + From < Vec < Value > > + From < HashMap < Key , Value , ObjectHasher > > + ' de ,
133+ Value : ValueBuilder < ' de > + From < Vec < Value > > + From < ObjectMap < Key , Value > > + ' de ,
121134 Key : Hash + Eq + From < & ' de str > ,
122135{
123136 match Deserializer :: from_slice_with_buffers ( s, buffers) {
@@ -128,7 +141,7 @@ where
128141
129142struct ValueDeserializer < ' de , Value , Key >
130143where
131- Value : ValueBuilder < ' de > + From < Vec < Value > > + From < HashMap < Key , Value , ObjectHasher > > + ' de ,
144+ Value : ValueBuilder < ' de > + From < Vec < Value > > + From < ObjectMap < Key , Value > > + ' de ,
132145 Key : Hash + Eq + From < & ' de str > ,
133146{
134147 de : Deserializer < ' de > ,
@@ -140,7 +153,7 @@ where
140153 Value : ValueBuilder < ' de >
141154 + From < & ' de str >
142155 + From < Vec < Value > >
143- + From < HashMap < Key , Value , ObjectHasher > >
156+ + From < ObjectMap < Key , Value > >
144157 + ' de ,
145158 Key : Hash + Eq + From < & ' de str > ,
146159{
@@ -179,8 +192,8 @@ where
179192
180193 #[ cfg_attr( not( feature = "no-inline" ) , inline) ]
181194 fn parse_map ( & mut self , len : usize ) -> Value {
182- let mut res: HashMap < Key , Value , ObjectHasher > =
183- HashMap :: with_capacity_and_hasher ( len, ObjectHasher :: default ( ) ) ;
195+ let mut res: ObjectMap < Key , Value > =
196+ ObjectMap :: with_capacity_and_hasher ( len, ObjectHasher :: default ( ) ) ;
184197
185198 // Since we checked if it's empty we know that we at least have one
186199 // element so we eat this
0 commit comments