Example #1
0
        /// <summary>
        /// Deserialize a JSON array into a collection.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the collection to create.</param>
        /// <param name="jsonArray">The JSON array to deserialize from.</param>
        /// <returns>The collection that represents the JSON array.</returns>
        static ICollection DeserializeCollection(IJsonSerializer serializer, Type type, JsonArray jsonArray)
        {
            Type collectionType;

            if (TypeHelper.TryGetCollectionType(type, out collectionType) == false)
            {
                throw new JsonException("Can not deserialize a JSON array to a type that doesnt support ICollection<T>.");
            }

            var method = collectionType
                         .GetTypeInfo()
                         .DeclaredMethods
                         .FirstOrDefault(m => m.DeclaringType == collectionType && m.Name == "Add");

            var elementType = collectionType.GenericTypeArguments[0];

            var collection = (ICollection)Activator.CreateInstance(type);

            foreach (var jsonValue in jsonArray)
            {
                var value = serializer.DeserializeValue(elementType, jsonValue);

                method.Invoke(collection, new[] { value });
            }

            return(collection);
        }
Example #2
0
        /// <summary>
        /// Deserialize the fields for the given instance.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="jsonObject">The JSON object to deserialize from.</param>
        /// <param name="fields">The list of fields to deserialize.</param>
        /// <param name="instance">The instance to deserialize into.</param>
        void DeserializeFields(IJsonSerializer serializer, JsonObject jsonObject, IReadOnlyList <IField> fields, object instance)
        {
            foreach (var member in jsonObject.Members)
            {
                var field = fields.SingleOrDefault(f => String.Equals(f.Name, member.Name, StringComparison.OrdinalIgnoreCase));

                field?.SetValue(instance, serializer.DeserializeValue(field.Accessor.ValueType, member.Value));
            }
        }
        /// <summary>
        /// Deserialize a JSON object.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the object to deserialize to.</param>
        /// <param name="jsonObject">The JSON object to deserialize from.</param>
        /// <returns>The CLR object that represents the JSON object.</returns>
        static object DeserializeObject(IJsonSerializer serializer, Type type, JsonObject jsonObject)
        {
            var entity = Activator.CreateInstance(type);

            foreach (var member in jsonObject.Members)
            {
                var property = type.GetRuntimeProperty(serializer.FieldNamingStrategy.ResolveName(member.Name));

                property?.SetValue(entity, serializer.DeserializeValue(property.PropertyType, member.Value));
            }

            return entity;
        }
Example #4
0
        /// <summary>
        /// Deserialize a JSON array into an array.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the array.</param>
        /// <param name="jsonArray">The JSON array to deserialize from.</param>
        /// <returns>The collection that represents the JSON array.</returns>
        static Array DeserializeArray(IJsonSerializer serializer, Type type, JsonArray jsonArray)
        {
            var array = Array.CreateInstance(type.GetElementType(), jsonArray.Count);

            for (var i = 0; i < jsonArray.Count; i++)
            {
                var value = serializer.DeserializeValue(type.GetElementType(), jsonArray[i]);

                array.SetValue(value, i);
            }

            return(array);
        }
Example #5
0
        /// <summary>
        /// Deserialize a JSON object.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the object to deserialize to.</param>
        /// <param name="jsonObject">The JSON object to deserialize from.</param>
        /// <returns>The CLR object that represents the JSON object.</returns>
        static object DeserializeObject(IJsonSerializer serializer, Type type, JsonObject jsonObject)
        {
            var entity = Activator.CreateInstance(type);

            foreach (var member in jsonObject.Members)
            {
                var property = type.GetRuntimeProperty(serializer.FieldNamingStrategy.ResolveName(member.Name));

                property?.SetValue(entity, serializer.DeserializeValue(property.PropertyType, member.Value));
            }

            return(entity);
        }
        ///// <summary>
        ///// Deserialize a JSON array.
        ///// </summary>
        ///// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        ///// <param name="type">The type of the collection to deserialize to.</param>
        ///// <param name="jsonArray">The JSON array to deserialize from.</param>
        ///// <returns>The collection that represents the JSON array.</returns>
        //static ICollection DeserializeArray(IJsonSerializer serializer, Type type, JsonArray jsonArray)
        //{
        //    Type collectionType;
        //    if (TypeHelper.TryGetCollectionType(type, out collectionType) == false)
        //    {
        //        if (TypeHelper.IsEnumerable(type) == false)
        //        {
        //            throw new JsonException("Can not deserialize a JSON array to a type that doesnt support ICollection<T>.");
        //        }

        //        type = typeof(List<>).MakeGenericType(type.GenericTypeArguments[0]);
        //        collectionType = type;
        //    }

        //    var method = collectionType
        //        .GetTypeInfo()
        //            .DeclaredMethods
        //                .FirstOrDefault(m => m.DeclaringType == collectionType && m.Name == "Add");

        //    var elementType = collectionType.GenericTypeArguments[0];

        //    var collection = Activator.CreateInstance(type) as ICollection;

        //    foreach (var jsonValue in jsonArray)
        //    {
        //        var value = serializer.DeserializeValue(elementType, jsonValue);

        //        method.Invoke(collection, new[] { value });
        //    }

        //    return collection;
        //}

        /// <summary>
        /// Deserialize a JSON array.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the collection to deserialize to.</param>
        /// <param name="jsonArray">The JSON array to deserialize from.</param>
        /// <returns>The collection that represents the JSON array.</returns>
        static ICollection DeserializeArray(IJsonSerializer serializer, Type type, JsonArray jsonArray)
        {
            // TODO: the collection access should be converted to a dynamically compiled delegate
            Type       elementType;
            MethodInfo method;

            if (TryGetCollectionType(type, out type, out elementType, out method) == false)
            {
                throw new JsonException("Can not deserialize a JSON array to a type that doesnt support ICollection<T>.");
            }

            var collection = Activator.CreateInstance(type) as ICollection;

            foreach (var jsonValue in jsonArray)
            {
                var value = serializer.DeserializeValue(elementType, jsonValue);

                method.Invoke(collection, new[] { value });
            }

            return(collection);
        }
Example #7
0
        /// <summary>
        /// Deserialize a JSON value to a defined CLR type.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The CLR type to deserialize the JSON value to.</param>
        /// <param name="jsonValue">The JSON value to deserialize.</param>
        /// <returns>The object that represents the CLR version of the given JSON value.</returns>
        public object DeserializeValue(IJsonSerializer serializer, Type type, JsonValue jsonValue)
        {
            type = Nullable.GetUnderlyingType(type) ?? type;

            return(serializer.DeserializeValue(type, jsonValue));
        }
        /// <summary>
        /// Deserialize a JSON value to a defined CLR type.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The CLR type to deserialize the JSON value to.</param>
        /// <param name="jsonValue">The JSON value to deserialize.</param>
        /// <returns>The object that represents the CLR version of the given JSON value.</returns>
        public object DeserializeValue(IJsonSerializer serializer, Type type, JsonValue jsonValue)
        {
            type = Nullable.GetUnderlyingType(type) ?? type;

            return serializer.DeserializeValue(type, jsonValue);
        }
        /// <summary>
        /// Deserialize a JSON array into an array.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the array.</param>
        /// <param name="jsonArray">The JSON array to deserialize from.</param>
        /// <returns>The collection that represents the JSON array.</returns>
        static Array DeserializeArray(IJsonSerializer serializer, Type type, JsonArray jsonArray)
        {
            var array = Array.CreateInstance(type.GetElementType(), jsonArray.Count);

            for (var i = 0; i < jsonArray.Count; i++)
            {
                var value = serializer.DeserializeValue(type.GetElementType(), jsonArray[i]);

                array.SetValue(value, i);
            }

            return array;
        }
        /// <summary>
        /// Deserialize a JSON array into a collection.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="type">The type of the collection to create.</param>
        /// <param name="jsonArray">The JSON array to deserialize from.</param>
        /// <returns>The collection that represents the JSON array.</returns>
        static ICollection DeserializeCollection(IJsonSerializer serializer, Type type, JsonArray jsonArray)
        {
            Type collectionType;
            if (TypeHelper.TryGetCollectionType(type, out collectionType) == false)
            {
                throw new JsonException("Can not deserialize a JSON array to a type that doesnt support ICollection<T>.");
            }

            var method = collectionType
                .GetTypeInfo()
                    .DeclaredMethods
                        .FirstOrDefault(m => m.DeclaringType == collectionType && m.Name == "Add");

            var elementType = collectionType.GenericTypeArguments[0];

            var collection = (ICollection)Activator.CreateInstance(type);

            foreach (var jsonValue in jsonArray)
            {
                var value = serializer.DeserializeValue(elementType, jsonValue);

                method.Invoke(collection, new[] { value });
            }

            return collection;
        }
        /// <summary>
        /// Deserialize the fields for the given instance.
        /// </summary>
        /// <param name="serializer">The serializer to utilize when deserializing nested objects.</param>
        /// <param name="jsonObject">The JSON object to deserialize from.</param>
        /// <param name="fields">The list of fields to deserialize.</param>
        /// <param name="instance">The instance to deserialize into.</param>
        void DeserializeFields(IJsonSerializer serializer, JsonObject jsonObject, IReadOnlyList<IField> fields, object instance)
        {
            foreach (var member in jsonObject.Members)
            {
                var field = fields.SingleOrDefault(f => String.Equals(f.Name, member.Name, StringComparison.OrdinalIgnoreCase));

                field?.SetValue(instance, serializer.DeserializeValue(field.Accessor.ValueType, member.Value));
            }
        }