stdweb/ecosystem/
serde_json.rs1use std::collections::BTreeMap;
2use serde_json::value::Value as JsonValue;
3use webcore::value::Value;
4use webcore::try_from::{TryFrom, TryInto};
5use webcore::number::ConversionError;
6
7impl TryFrom< JsonValue > for Value {
8 type Error = ConversionError;
9
10 #[inline]
11 fn try_from( value: JsonValue ) -> Result< Self, Self::Error > {
12 let result = match value {
13 JsonValue::Null => Value::Null,
14 JsonValue::Bool( value ) => Value::Bool( value ),
15 JsonValue::Number( value ) => {
16 if let Some( value ) = value.as_u64() {
17 Value::Number( value.try_into()? )
18 } else if let Some( value ) = value.as_i64() {
19 Value::Number( value.try_into()? )
20 } else {
21 Value::Number( value.as_f64().unwrap().into() )
22 }
23 },
24 JsonValue::String( value ) => Value::String( value ),
25 JsonValue::Array( value ) => {
26 let mut vector: Vec< Value > = Vec::new();
27
28 vector.reserve( value.len() );
29 for element in value.into_iter() {
30 vector.push( element.try_into()? );
31 }
32
33 vector.into()
34 },
35 JsonValue::Object( value ) => {
36 let mut map: BTreeMap< String, Value > = BTreeMap::new();
37 for (key, value) in value.into_iter() {
38 map.insert( key.into(), value.try_into()? );
39 }
40
41 map.into()
42 }
43 };
44
45 Ok( result )
46 }
47}