diff --git a/Assets/VRM/UniJSON/Scripts/GenericDeserializer.cs b/Assets/VRM/UniJSON/Scripts/GenericDeserializer.cs index e61cdad61..b3fd424c9 100644 --- a/Assets/VRM/UniJSON/Scripts/GenericDeserializer.cs +++ b/Assets/VRM/UniJSON/Scripts/GenericDeserializer.cs @@ -40,6 +40,60 @@ namespace UniJSON return u; } + static object DefaultDictionaryDeserializer(ListTreeNode s) + { + switch (s.Value.ValueType) + { + case ValueNodeType.Object: + { + var u = new Dictionary(); + foreach (var kv in s.ObjectItems()) + { + //var e = default(object); + //kv.Value.Deserialize(ref e); + u.Add(kv.Key.GetString(), DefaultDictionaryDeserializer(kv.Value)); + } + return u; + } + + case ValueNodeType.Null: + return null; + + case ValueNodeType.Boolean: + return s.GetBoolean(); + + case ValueNodeType.Integer: + return s.GetInt32(); + + case ValueNodeType.Number: + return s.GetDouble(); + + case ValueNodeType.String: + return s.GetString(); + + default: + throw new NotImplementedException(s.Value.ValueType.ToString()); + } + } + + /// + /// Deserialize Dictionary only string key + /// + /// + /// + /// + static Dictionary DictionaryDeserializer(ListTreeNode s) + { + var d = new Dictionary(); + foreach (var kv in s.ObjectItems()) + { + var value = default(V); + GenericDeserializer.Deserialize(kv.Value, ref value); + d.Add(kv.Key.GetString(), value); + } + return d; + } + delegate void FieldSetter(ListTreeNode s, object o); static FieldSetter GetFieldDeserializer(FieldInfo fi) { @@ -107,12 +161,20 @@ namespace UniJSON return GenericInvokeCallFactory.StaticFunc, U>(g); } + if (target == typeof(Dictionary)) + { + + var mi = typeof(GenericDeserializer).GetMethod("DefaultDictionaryDeserializer", + BindingFlags.Static | BindingFlags.NonPublic); + return GenericInvokeCallFactory.StaticFunc, U>(mi); + } + else if (target.GetGenericTypeDefinition() == typeof(Dictionary<,>) && target.GetGenericArguments()[0] == typeof(string)) { - var mi = typeof(ListTreeNodeDeserializerExtensions).GetMethod("DictionaryDeserializer", + var mi = typeof(GenericDeserializer).GetMethod("DictionaryDeserializer", BindingFlags.Static | BindingFlags.NonPublic); - var g = mi.MakeGenericMethod(typeof(T)); + var g = mi.MakeGenericMethod(target.GetGenericArguments()[1]); return GenericInvokeCallFactory.StaticFunc, U>(g); } } diff --git a/Assets/VRM/UniJSON/Scripts/ListTreeNode/ListTreeNodeDeserializerExtensions.cs b/Assets/VRM/UniJSON/Scripts/ListTreeNode/ListTreeNodeDeserializerExtensions.cs index b5fda3380..e07560648 100644 --- a/Assets/VRM/UniJSON/Scripts/ListTreeNode/ListTreeNodeDeserializerExtensions.cs +++ b/Assets/VRM/UniJSON/Scripts/ListTreeNode/ListTreeNodeDeserializerExtensions.cs @@ -8,43 +8,6 @@ namespace UniJSON { public static class ListTreeNodeDeserializerExtensions { - static object DictionaryDeserializer(ListTreeNode s) - where T : IListTreeItem, IValue - { - switch (s.Value.ValueType) - { - case ValueNodeType.Object: - { - var u = new Dictionary(); - foreach (var kv in s.ObjectItems()) - { - //var e = default(object); - //kv.Value.Deserialize(ref e); - u.Add(kv.Key.GetString(), DictionaryDeserializer(kv.Value)); - } - return u; - } - - case ValueNodeType.Null: - return null; - - case ValueNodeType.Boolean: - return s.GetBoolean(); - - case ValueNodeType.Integer: - return s.GetInt32(); - - case ValueNodeType.Number: - return s.GetDouble(); - - case ValueNodeType.String: - return s.GetString(); - - default: - throw new NotImplementedException(s.Value.ValueType.ToString()); - } - } - public static void Deserialize(this ListTreeNode self, ref U value) where T : IListTreeItem, IValue {