Skip to content

Commit

Permalink
fixed handling of JSON arrays in ArgsJsonConverter
Browse files Browse the repository at this point in the history
  • Loading branch information
ze-german committed Sep 20, 2016
1 parent 84c4a1b commit 5d0f0a4
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 10 deletions.
27 changes: 18 additions & 9 deletions Signum.React/JsonConverters/ArgsJsonConverter.cs
Expand Up @@ -38,9 +38,9 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist

while (reader.TokenType != JsonToken.EndArray)
{
var obj = serializer.Deserialize(reader);
var token = JToken.Load(reader);

var converted = ConvertObject(obj, serializer);
var converted = ConvertObject(token, serializer);

args.Add(converted);

Expand All @@ -52,27 +52,36 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
return args.ToArray();
}

private object ConvertObject(object obj, JsonSerializer serializer)
private object ConvertObject(JToken token, JsonSerializer serializer)
{
if (obj == null)
if (token == null)
return null;

if (obj is string || obj is DateTime || obj is long || obj is double)
if (token is JValue)
{
var obj = ((JValue) token).Value;
return obj;
}
else if (obj is JObject)

if (token is JObject)
{
var j = (JObject)obj;
var j = (JObject)token;

if (j.Property("EntityType") != null)
return serializer.Deserialize(new JTokenReader(j), typeof(Lite<Entity>));

if (j.Property("Type") != null)
return serializer.Deserialize(new JTokenReader(j), typeof(ModifiableEntity));
}
else if (token is JArray)
{
var a = (JArray)token;
var result = a.Select(t => ConvertObject(t, serializer)).ToList();
return result;

}

throw new NotSupportedException("Unable to deserialize dynamically:" + obj.ToString());
throw new NotSupportedException("Unable to deserialize dynamically:" + token.ToString());
}

}
}
13 changes: 12 additions & 1 deletion Signum.Utilities/Extensions/ArgsExtensions.cs
@@ -1,7 +1,9 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Signum.Utilities.Reflection;

namespace Signum.Utilities
{
Expand Down Expand Up @@ -33,7 +35,16 @@ static IEnumerable<T> OfTypeOrEmpty<T>(this IEnumerable<object> args)
if (args == null)
return Enumerable.Empty<T>();

return args.OfType<T>();
return args
.Where(o => o is T || o is List<object> && typeof(T).IsInstantiationOf(typeof(List<>)))
.Select(o => o is T ? (T) o : (T)giConvertListTo.GetInvoker(typeof(T).ElementType())((List<object>) o));
}

static readonly GenericInvoker<Func<List<object>,IList>> giConvertListTo = new GenericInvoker<Func<List<object>, IList>>(list => ConvertListTo<int>(list));

static List<S> ConvertListTo<S>(List<object> list)
{
return list.Cast<S>().ToList();
}
}
}

0 comments on commit 5d0f0a4

Please sign in to comment.