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