首页 > 技术文章 > C# Json 解析,针对数字开头变量Json字符串转模型(Model)

LuoCore 2021-07-02 15:05 原文

namespace 解析数字开头的变量JSON
{
    class Program
    {
        static void Main(string[] args)
        {
            string strJson = "{\"1st_attempt\":\"2021-02-09 16:32:15\",\"2nd_attempt\":\"2021-02-09 16:33:18\"}";
            var objModel = JsonDictionaryModel<ResModels>(strJson);
        }
 
        public class ResModels
        {
            public string _1st_attempt { get; set; }
            public string _2nd_attempt { get; set; }
        }


        public static T JsonDictionaryModel<T>(string strJson) 
        {
            Dictionary<string, object> ProductDetailList = JsonConvert.DeserializeObject<Dictionary<string, object>>(strJson);
            return ParseDictionaryToModel<T>(ProductDetailList);
        }
        public static T ParseDictionaryToModel<T>(Dictionary<string, object> dict)
        {
            T obj = default(T);
            obj = Activator.CreateInstance<T>();
            //根据Key值设定 Columns
            foreach (KeyValuePair<string, object> item in dict)
            {
                PropertyInfo prop = obj.GetType().GetProperty(item.Key);
                if (Equals(prop, null)) 
                {
                    prop = obj.GetType().GetProperty("_"+item.Key);
                }
                if (!Equals(item.Value,null))
                {
                    object value = item.Value;
                    //Nullable 获取Model类字段的真实类型
                    Type itemType = Nullable.GetUnderlyingType(prop.PropertyType) == null ? prop.PropertyType : Nullable.GetUnderlyingType(prop.PropertyType);
                    //根据Model类字段的真实类型进行转换
                    prop.SetValue(obj, Convert.ChangeType(value, itemType), null);
                }
            }
            return obj;
        }
    }
}

 https://www.cnblogs.com/volts0302/p/5195086.html

https://blog.csdn.net/weixin_33853794/article/details/92936314

 

改进版:

public static T JsonDictionaryModel<T>(string strJson)
        {
            Dictionary<string, object> ProductDetailList = JsonConvert.DeserializeObject<Dictionary<string, object>>(strJson);
            return ParseDictionaryToModel<T>(ProductDetailList);
        }
        public static T ParseDictionaryToModel<T>(Dictionary<string, object> dict)
        {
            T objModel = Activator.CreateInstance<T>();
            foreach (KeyValuePair<string, object> item in dict)
            {
                PropertyInfoMethod(objModel, item.Key, item.Value);
            }
            return objModel;
        }
//这里实在想不到办法优化了
public static void PropertyInfoMethod(object objModel, string keyName, object objValue) { PropertyInfo prop = objModel.GetType().GetProperty(keyName) ?? objModel.GetType().GetProperty("_" + keyName); if (!Equals(null, prop)&&!Equals(null, objValue)) prop.SetValue(objModel, Convert.ChangeType(objValue, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType), null); }

 

推荐阅读