当前位置:  编程技术>.net/c#/asp.net

自定义实现Json字符串向C#对象转变的方法

    来源: 互联网  发布时间:2014-10-17

    本文导语:  这里使用Atrribute的方式实现了Json字符串向C#对象的转变。因为功能局限,此版本只是针对于Json字符串,如"response":"Hello","id":21231513,"result":100,"msg":"OK."; 而不是Json数组。这里的Atrribute是作用在属性上,像NHibernate中的Atrribute一样,...

这里使用Atrribute的方式实现了Json字符串向C#对象的转变。因为功能局限,此版本只是针对于Json字符串,如"response":"Hello","id":21231513,"result":100,"msg":"OK."; 而不是Json数组。这里的Atrribute是作用在属性上,像NHibernate中的Atrribute一样,是在运行时通过反射来获取这个属性对应于Json字符串中的哪个key.

代码如下:

namespace JsonMapper
{
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
    public class JsonFieldAttribute : Attribute
    {
        private string _Name = string.Empty;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }
}


接下来是这个转换工具中的核心代码,主要是分解并且分析Json字符串中key与value, 并且通过反射获得对象中的各个对应属性并且赋值。
代码如下:

namespace JsonMapper
{
    public class JsonToInstance
    {
        public T ToInstance(string json) where T : new()
        {
            Dictionary dic = new Dictionary();
            string[] fields = json.Split(',');
            for (int i = 0; i < fields.Length; i++ )
            {
                string[] keyvalue = fields[i].Split(':');
                dic.Add(Filter(keyvalue[0]), Filter(keyvalue[1]));
            }

            PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            T entity = new T();
            foreach (PropertyInfo property in properties)
            {
                object[] propertyAttrs = property.GetCustomAttributes(false);
                for (int i = 0; i < propertyAttrs.Length; i++)
                {
                    object propertyAttr = propertyAttrs[i];
                    if (propertyAttr is JsonFieldAttribute)
                    {
                        JsonFieldAttribute jsonFieldAttribute = propertyAttr as JsonFieldAttribute;
                        foreach (KeyValuePair item in dic)
                        {
                            if (item.Key == jsonFieldAttribute.Name)
                            {
                                Type t = property.PropertyType;
                                property.SetValue(entity, ToType(t, item.Value), null);
                                break;
                            }
                        }
                    }
                }
            }
            return entity;
        }

        private string Filter(string str)
        {
            if (!(str.StartsWith(""") && str.EndsWith(""")))
            {
                return str;
            }
            else
            {
                return str.Substring(1, str.Length - 2);
            }
        }

        public object ToType(Type type, string value)
        {
            if (type == typeof(string))
            {
                return value;
            }

            MethodInfo parseMethod = null;

            foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static
                | BindingFlags.Public))
            {
                if (mi.Name == "Parse" && mi.GetParameters().Length == 1)
                {
                    parseMethod = mi;
                    break;
                }
            }

            if (parseMethod == null)
            {
                throw new ArgumentException(string.Format(
                    "Type: {0} has not Parse static method!", type));
            }

            return parseMethod.Invoke(null, new object[] { value });
        }
    }
}

最后这是用于测试的代码

代码如下:

public class Message
    {
        //{ "result": 100, "response": "Who are you?!", "id": 13185569, "msg": "OK." }

        [JsonField(Name = "result")]
        public int Result { get; set; }

        [JsonField(Name = "response")]
        public string Response { get; set; }

        [JsonField(Name = "id")]
        public int Id { get; set; }

        [JsonField(Name = "msg")]
        public string Msg { get; set; }
    }

代码如下:

class Program
    {
        static void Main(string[] args)
        {
            JsonToInstance util = new JsonToInstance();
            string json = ""response":"我是阿猫酱的小黄鸡","id":21231513,"result":100,"msg":"OK."";
            Message m = util.ToInstance(json);
        }
    }

    
 
 

您可能感兴趣的文章:

  • C#实现自定义双击事件
  • 如何实现C#自定义结构的强制转换
  • C#通过反射创建自定义泛型
  • C#自定义控件添加右键菜单的实现代码
  • C#使用yield关键字让自定义集合实现foreach遍历的方法
  • Visual C#类的定义及实现方法实例解析
  • C# Form自定义光标的简单实现
  • C#常用自定义函数小结
  • 提取html中文字 C#自定义函数
  • C# .NET自定义类实现伪静态页面的代码
  • C#学习笔记之用户定义类(或结构)的类型转换
  • c#自定义泛型类的实现
  • c# 自定义泛型链表类的详解
  • 深入解析c#中枚举类型的定义与使用
  • C#定义并实现单链表实例解析
  • C#自定义函数NetxtString生成随机字符串
  • C#中HashTable的定义与使用方法
  • 解决C# winForm自定义鼠标样式的两种实现方法详解
  • C#用户定义类型转换详解
  • C#实现ProperTyGrid自定义属性的方法
  • 如何定义一个字符串数组
  • PHP生成自定义长度随机字符串的函数分享
  • Python 字符串定义
  • 怎样把一个字符串就定义为只有一个双引号? String a='"'?
  • 定义了public static void main(String args[]) 怎么接受不了输入的字符串?
  • php生成随机字符串(自定义纯数字、纯字母或数字字母混合)
  • php生成自定义长度随机字符串的函数
  • django自定义Field实现一个字段存储以逗号分隔的字符串
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux内核怎么定义汇编全局变量及在c文件中使用这个变量?有关0。11下的字符回显
  • 字符设备驱动程序编写中,被读写的数据到底应该定义在什么地方?
  • 打开自定义的字符设备文件失败
  • django自定义Field实现一个字段存储以逗号分隔的字符串 iis7站长之家
  • 为2410编译字符驱动提示函数未定义的问题
  • 我在一个字符设备写了一些方法,read,write等,我在用户层使用这些系统调用的时候怎么用到我这个字符设备驱动所定义的??
  • java命名空间java.awt类radialgradientpaint的类成员方法: getradius定义及介绍
  • 请问可以用宏定义定义一个二维数组吗?
  • java命名空间javax.xml.stream类xmlinputfactory成员方法: seteventallocator定义参考
  • 想修改路径定义,想找到在哪里定义的,应该怎么办?
  • java命名空间java.text接口attributedcharacteriterator的类成员方法: getallattributekeys定义及介绍
  • php定义数组和使用示例(php数组的定义方法)
  • java命名空间java.beans接口propertyeditor的类成员方法: supportscustomeditor定义及介绍
  • 上次问题解决了,原来是extern被重定义了。。。天阿,关键字也可以被重定义。。。。。欢迎接分
  • java命名空间javax.swing类jtextarea的类成员方法: getcolumnwidth定义及介绍
  • 如何定义一个可变参数的自定义函数
  • java命名空间javax.swing类jtextfield的类成员方法: getcolumnwidth定义及介绍
  • 下面的变量我都下了定义,为什么还出现没定义的信息
  • java命名空间javax.swing类actionmap的类成员方法: allkeys定义及介绍
  • oracle异常(预定义异常,自定义异常)应用介绍
  • java命名空间javax.swing类inputmap的类成员方法: allkeys定义及介绍
  • 为什么我在头文件time.h里找不到time_t的定义呢?只有这个定义typedef __time_t time_t;
  • java命名空间javax.rmi.corba接口valuehandler的类成员方法: iscustommarshaled定义及介绍
  • 函数有定义怎么提示没有低能定义的错误呢?
  • java命名空间javax.swing类jcomponent的类成员方法: resetkeyboardactions定义及介绍
  • android自定义控件和自定义回调函数步骤示例
  • java命名空间java.beans接口customizer的类成员方法: setobject定义及介绍
  • 自定义公共类的装载,包的定义


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3