From cd8d755a1e881f92d7bc6874b7b4c8f742dfda73 Mon Sep 17 00:00:00 2001 From: linvi Date: Sun, 14 Aug 2016 12:45:37 +0100 Subject: [PATCH] #75 Added support to Array serialization and ISavedSearch --- .../Core/Factories/ISavedSearchFactory.cs | 1 + .../Core/Factories/ITweetFactory.cs | 2 +- .../SavedSearch/SavedSearchFactory.cs | 38 +++++++--- Tweetinvi.Factories/Tweet/TweetFactory.cs | 4 +- Tweetinvi/JsonExtensions.cs | 71 +++++++++++++------ 5 files changed, 81 insertions(+), 35 deletions(-) diff --git a/Tweetinvi.Core/Core/Factories/ISavedSearchFactory.cs b/Tweetinvi.Core/Core/Factories/ISavedSearchFactory.cs index 914a39e09..1506bc7ca 100644 --- a/Tweetinvi.Core/Core/Factories/ISavedSearchFactory.cs +++ b/Tweetinvi.Core/Core/Factories/ISavedSearchFactory.cs @@ -10,5 +10,6 @@ public interface ISavedSearchFactory ISavedSearch GetSavedSearch(long searchId); ISavedSearch GenerateSavedSearchFromDTO(ISavedSearchDTO savedSearchDTO); IEnumerable GenerateSavedSearchesFromDTOs(IEnumerable savedSearchDTO); + ISavedSearch GenerateSavedSearchFromJson(string json); } } \ No newline at end of file diff --git a/Tweetinvi.Core/Core/Factories/ITweetFactory.cs b/Tweetinvi.Core/Core/Factories/ITweetFactory.cs index ff8fafc2a..42ef4fa49 100644 --- a/Tweetinvi.Core/Core/Factories/ITweetFactory.cs +++ b/Tweetinvi.Core/Core/Factories/ITweetFactory.cs @@ -12,7 +12,7 @@ public interface ITweetFactory ITweet CreateTweet(string text); // Generate Tweet From Json - ITweet GenerateTweetFromJson(string jsonTweet); + ITweet GenerateTweetFromJson(string json); // Generate Tweet from DTO ITweet GenerateTweetFromDTO(ITweetDTO tweetDTO); diff --git a/Tweetinvi.Factories/SavedSearch/SavedSearchFactory.cs b/Tweetinvi.Factories/SavedSearch/SavedSearchFactory.cs index a24c55049..0eb058804 100644 --- a/Tweetinvi.Factories/SavedSearch/SavedSearchFactory.cs +++ b/Tweetinvi.Factories/SavedSearch/SavedSearchFactory.cs @@ -1,20 +1,26 @@ using System.Collections.Generic; using System.Linq; using Tweetinvi.Core.Factories; +using Tweetinvi.Core.Helpers; using Tweetinvi.Core.Injectinvi; using Tweetinvi.Models; using Tweetinvi.Models.DTO; namespace Tweetinvi.Factories.SavedSearch { - public class SavedSearchFactory : ISavedSearchFactory + public class SavedSearchFactory : ISavedSearchFactory { private readonly ISavedSearchQueryExecutor _savedSearchQueryExecutor; + private readonly IJsonObjectConverter _jsonObjectConverter; private readonly IFactory _savedSearchUnityFactory; - public SavedSearchFactory(ISavedSearchQueryExecutor savedSearchQueryExecutor, IFactory savedSearchUnityFactory) + public SavedSearchFactory( + ISavedSearchQueryExecutor savedSearchQueryExecutor, + IJsonObjectConverter jsonObjectConverter, + IFactory savedSearchUnityFactory) { _savedSearchQueryExecutor = savedSearchQueryExecutor; + _jsonObjectConverter = jsonObjectConverter; _savedSearchUnityFactory = savedSearchUnityFactory; } @@ -39,14 +45,26 @@ public ISavedSearch GenerateSavedSearchFromDTO(ISavedSearchDTO savedSearchDTO) return _savedSearchUnityFactory.Create(savedSearchDTOParameter); } - public IEnumerable GenerateSavedSearchesFromDTOs(IEnumerable savedSearchDTOs) - { - if (savedSearchDTOs == null) - { - return null; - } + public IEnumerable GenerateSavedSearchesFromDTOs(IEnumerable savedSearchDTOs) + { + if (savedSearchDTOs == null) + { + return null; + } + + return savedSearchDTOs.Select(GenerateSavedSearchFromDTO); + } - return savedSearchDTOs.Select(GenerateSavedSearchFromDTO); - } + // Generate SavedSearch from Json + public ISavedSearch GenerateSavedSearchFromJson(string json) + { + var savedSearchDTO = _jsonObjectConverter.DeserializeObject(json); + if (savedSearchDTO == null || savedSearchDTO.Id == TweetinviSettings.DEFAULT_ID) + { + return null; + } + + return GenerateSavedSearchFromDTO(savedSearchDTO); + } } } \ No newline at end of file diff --git a/Tweetinvi.Factories/Tweet/TweetFactory.cs b/Tweetinvi.Factories/Tweet/TweetFactory.cs index ebdeab970..c88d010e7 100644 --- a/Tweetinvi.Factories/Tweet/TweetFactory.cs +++ b/Tweetinvi.Factories/Tweet/TweetFactory.cs @@ -54,9 +54,9 @@ public ITweet CreateTweet(string text) } // Generate Tweet from Json - public ITweet GenerateTweetFromJson(string jsonTweet) + public ITweet GenerateTweetFromJson(string json) { - var tweetDTO = _jsonObjectConverter.DeserializeObject(jsonTweet); + var tweetDTO = _jsonObjectConverter.DeserializeObject(json); if (tweetDTO == null || tweetDTO.Id == TweetinviSettings.DEFAULT_ID) { return null; diff --git a/Tweetinvi/JsonExtensions.cs b/Tweetinvi/JsonExtensions.cs index 2e8d5cc88..a50bd7274 100644 --- a/Tweetinvi/JsonExtensions.cs +++ b/Tweetinvi/JsonExtensions.cs @@ -69,13 +69,17 @@ static JsonExtensions() var userFactory = TweetinviContainer.Resolve(); var messageFactory = TweetinviContainer.Resolve(); var twitterListFactory = TweetinviContainer.Resolve(); + var savedSearchFactory = TweetinviContainer.Resolve(); _getSerializableObject = new Dictionary(); - _getSerializableObject.Add(typeof(ITweet), new JsonMap(u => u.TweetDTO, tweetFactory.GenerateTweetFromJson)); - _getSerializableObject.Add(typeof(IUser), new JsonMap(u => u.UserDTO, userFactory.GenerateUserFromJson)); - _getSerializableObject.Add(typeof(IMessage), new JsonMap(m => m.MessageDTO, messageFactory.GenerateMessageFromJson)); - _getSerializableObject.Add(typeof(ITwitterList), new JsonMap(l => l.TwitterListDTO, twitterListFactory.GenerateListFromJson)); + // ReSharper disable RedundantTypeArgumentsOfMethod + Map(u => u.TweetDTO, tweetFactory.GenerateTweetFromJson); + Map(u => u.UserDTO, userFactory.GenerateUserFromJson); + Map(m => m.MessageDTO, messageFactory.GenerateMessageFromJson); + Map(l => l.TwitterListDTO, twitterListFactory.GenerateListFromJson); + Map(s => s.SavedSearchDTO, savedSearchFactory.GenerateSavedSearchFromJson); + // ReSharper restore RedundantTypeArgumentsOfMethod } public static string ToJson(this T obj) where T : class @@ -119,33 +123,51 @@ public static T ConvertJsonTo(this string json) where T : class { var type = typeof(T); - if (_getSerializableObject.ContainsKey(type)) - { - return _getSerializableObject[type].GetDeserializedObject(json) as T; - } - - if (typeof(IEnumerable).IsAssignableFrom(type) && type.IsGenericType) + try { - var genericType = type.GetGenericArguments()[0]; - if (_getSerializableObject.ContainsKey(genericType)) + if (_getSerializableObject.ContainsKey(type)) { - var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(genericType)); - var serializer = _getSerializableObject[genericType]; + return _getSerializableObject[type].GetDeserializedObject(json) as T; + } - JArray jsonArray = JArray.Parse(json); + if (typeof(IEnumerable).IsAssignableFrom(type)) + { + Type genericType = null; - foreach (var elt in jsonArray) + if (type.IsGenericType) { - var eltJson = elt.ToJson(); - list.Add(serializer.GetDeserializedObject(eltJson)); + genericType = type.GetGenericArguments()[0]; + } + else if (typeof(Array).IsAssignableFrom(type)) + { + genericType = type.GetElementType(); } - return list as T; + if (_getSerializableObject.ContainsKey(genericType)) + { + var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(genericType)); + var serializer = _getSerializableObject[genericType]; + + JArray jsonArray = JArray.Parse(json); + + foreach (var elt in jsonArray) + { + var eltJson = elt.ToJson(); + list.Add(serializer.GetDeserializedObject(eltJson)); + } + + if (typeof(Array).IsAssignableFrom(type)) + { + var array = Array.CreateInstance(genericType, list.Count); + list.CopyTo(array, 0); + return array as T; + } + + return list as T; + } } - } - try - { + return JsonConvert.DeserializeObject(json, JsonPropertiesConverterRepository.Converters); } catch (Exception ex) @@ -153,5 +175,10 @@ public static T ConvertJsonTo(this string json) where T : class throw new Exception("The type provided is probably not compatible with Tweetinvi Json serializer.", ex); } } + + private static void Map(Func getSerializableObject, Func deserializer) where T1 : class where T2 : class + { + _getSerializableObject.Add(typeof(T1), new JsonMap(getSerializableObject, deserializer)); + } } } \ No newline at end of file