Exemplo n.º 1
0
        /// <summary>
        /// Json 转换到 对象
        /// </summary>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="JsonException"></exception>
        /// <exception cref="JsonFormatException"></exception>
        /// <returns></returns>
        public static object?JsonToTarget(Json json, Type conversionType)
        {
            if (json == null)
            {
                throw new ArgumentNullException(nameof(json));
            }
            if (json == Json.Null)
            {
                return(null);
            }
            if (json is not JsonObject jobj)
            {
                throw new ArgumentException("JsonDynamicDataFormat 转换异常, [Json] 类型错误!");
            }
            if (!jobj.TryGetValue(nameof(IJsonDynamicObject.ClassName), out Json jname))
            {
                throw new JsonFormatException("JsonDynamicDataFormat 转换异常,[ClassName] 丢失!");
            }

            var typeName = (string?)jname;

            if (typeName == null)
            {
                throw new JsonFormatException("JsonDynamicDataFormat 转换异常,[ClassName] is null!");
            }
            var itemType = JsonType.GetTypeByName(typeName, conversionType);

            if (itemType == null)
            {
                throw new JsonFormatException("JsonDynamicDataFormat 转换异常,未找到类型 [Type]=[" + typeName + "]!");
            }
            var target  = JsonUtility.GetUninitializedObject(itemType);
            var members = JsonUtility.GetJsonMemberAttributes(itemType);

            foreach (var member in members)
            {
                if (member.CanWrite && jobj.ContainsKey(member.Name))
                {
                    var value = jobj[member.Name];
                    member.SetValue(target, value);
                }
            }

            return(target);
        }