栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

Json.Net 小提示1 (反序列化失败的解决方案)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Json.Net 小提示1 (反序列化失败的解决方案)

Json.Net 小提示1 (反序列化失败的解决方案)

最近在Unity中使用时遇到的问题,继承IEnumable接口导致反序列化失败,经过多方查找解决了.
下图调用 JsonConvert.PopulateObject();一直报错,反复对照json文件,并没有发现什么问题.

解决方案如下(我这里是使用默认解析比较方便,当然自定义解析也可以解决.),更详细的问题根源,继续往下.

下方代码是json.net,反序列化构造对象的过程.(可以看到JsonObject转换顺序在上方,高于IEnumerable).
源码链接:https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs#L1218

        /// 
        /// Determines which contract type is created for the given type.
        /// 
        /// Type of the object.
        /// A  for the given type.
        protected virtual JsonContract CreateContract(Type objectType)
        {
            Type t = ReflectionUtils.EnsureNotByRefType(objectType);

            if (IsJsonPrimitiveType(t))
            {
                return CreatePrimitiveContract(objectType);
            }

            t = ReflectionUtils.EnsureNotNullableType(t);
            JsonContainerAttribute? containerAttribute = JsonTypeReflector.GetCachedAttribute(t);

            if (containerAttribute is JsonObjectAttribute)
            {
                return CreateObjectContract(objectType);
            }

            if (containerAttribute is JsonArrayAttribute)
            {
                return CreateArrayContract(objectType);
            }

            if (containerAttribute is JsonDictionaryAttribute)
            {
                return CreateDictionaryContract(objectType);
            }

            if (t == typeof(JToken) || t.IsSubclassOf(typeof(JToken)))
            {
                return CreateLinqContract(objectType);
            }

            if (CollectionUtils.IsDictionaryType(t))
            {
                return CreateDictionaryContract(objectType);
            }

            if (typeof(IEnumerable).IsAssignableFrom(t))
            {
                return CreateArrayContract(objectType);
            }

            if (CanConvertToString(t))
            {
                return CreateStringContract(objectType);
            }

#if HAVE_BINARY_SERIALIZATION
            if (!IgnoreSerializableInterface && typeof(ISerializable).IsAssignableFrom(t) && JsonTypeReflector.IsSerializable(t))
            {
                return CreateISerializableContract(objectType);
            }
#endif

#if HAVE_DYNAMIC
            if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(t))
            {
                return CreateDynamicContract(objectType);
            }
#endif

#if HAVE_ICONVERTIBLE
            // tested last because it is not possible to automatically deserialize custom IConvertible types
            if (IsIConvertible(t))
            {
                return CreatePrimitiveContract(t);
            }
#endif

            return CreateObjectContract(objectType);
        }

结语:好了反序列化也解决了,如果出现反序列化失败了,可以回头看看构造的顺序.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/904891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号