前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原 ObjectToJson实现

原 ObjectToJson实现

作者头像
魂祭心
发布2018-05-17 17:39:41
4840
发布2018-05-17 17:39:41
举报
文章被收录于专栏:魂祭心魂祭心

特性标记:

代码语言:javascript
复制
    [System.AttributeUsage(System.AttributeTargets.Property)]
    class UseForJsonAttribute : Attribute
    {
        public Boolean IsUse { get; set; }
        public UseForJsonAttribute(Boolean isUse)
        {
            IsUse = isUse;
        }
    }

代码:

代码语言:javascript
复制
    public class ObjToJson<T>
    {
        //为null时返回
        private const string undifined = "\"undefined\"";
        StringBuilder jsonBuilder = new StringBuilder();
        public ObjToJson()
        {
            if (typeof(T).IsGenericType)
            { throw new Exception("暂不支持泛型"); }
        }
        public string ToJson(T instance)
        {
            if (instance == null) return undifined;
            MakeJson(instance);
            return jsonBuilder.ToString();
        }
        private void MakeJson(Object instance)
        {
            //区分数组类型和普通类
            if (instance is Array)
            {
                ArrayToJson(instance);
            }
            else {
                EntityToJson(instance);
            }
        }
        private void ArrayToJson(Object instance)
        {
            jsonBuilder.Append("[");
            Array obj = (instance as Array);
            //逐个循环调用makjson
            for (int i = 0; i < obj.Length; i++)
            {
                if (obj.GetValue(i) == null)
                    jsonBuilder.Append(undifined);
                else
                    MakeJson(obj.GetValue(i));
                jsonBuilder.Append(",");
            }
            if (jsonBuilder[jsonBuilder.Length - 1] == ',')
            {
                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            }
            jsonBuilder.Append("]");
        }
        private void EntityToJson(Object instance)
        {
            jsonBuilder.Append("{");
            PropertyInfo[] pInfos = instance.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
            foreach (PropertyInfo pInfo in pInfos)
            {
                //判断该成员是否序列
                if (IsUseProperty(pInfo))
                {
                    //加入key
                    jsonBuilder.Append("\"");
                    TransformChar(pInfo.Name);
                    jsonBuilder.Append("\":");
                    //加入value
                    object value = pInfo.GetValue(instance);
                    if (pInfo.PropertyType.IsValueType)
                    {
                        //值类型
                        TransformChar(value.ToString());
                        jsonBuilder.Append(',');
                    }            
                    else if (pInfo.PropertyType.ToString() == "System.String")
                    {
                        //字符类型
                        jsonBuilder.Append("\"");
                        if (value == null)
                            jsonBuilder.Append(undifined);
                        else
                            TransformChar(value.ToString());
                        jsonBuilder.Append("\",");
                    }
                    else {
                        //引用类型
                        if (value == null)
                            jsonBuilder.Append(undifined);
                        else
                            MakeJson(value);
                        jsonBuilder.Append(',');
                    }
                }
            }
            if (jsonBuilder[jsonBuilder.Length - 1] == ',')
            {
                jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            }
            jsonBuilder.Append("}");
        }
        private bool IsUseProperty(PropertyInfo pInfo)
        {
            UseForJsonAttribute ufa = pInfo.GetCustomAttribute<UseForJsonAttribute>();
            if (ufa != null && ufa.IsUse == true)
            { return true; }
            return false;
        }
        private void TransformChar(string aString)
        {
            for (int i = 0; i < aString.Length; ++i)
            {
                switch (aString[i])
                {
                    case '\\':
                        jsonBuilder.Append("\\\\");
                        break;

                    case '/':
                        jsonBuilder.Append("\\/");
                        break;

                    case '"':
                        jsonBuilder.Append("\\\"");
                        break;

                    case '\t':
                        jsonBuilder.Append("\\t");
                        break;
                    case '\f':
                        jsonBuilder.Append("\\f");
                        break;
                    case '\b':
                        jsonBuilder.Append("\\b");
                        break;
                    case '\n':
                        jsonBuilder.Append("\\n");
                        break;
                    case '\r':
                        jsonBuilder.Append("\\r");
                        break;
                    default:
                        {
                            jsonBuilder.Append(aString[i]);
                            break;
                        }

                }
            }
        }
    }

测试类:

代码语言:javascript
复制
    public class Class
    {
        [UseForJsonAttribute(true)]
        public int RoomID { get; set; }
        [UseForJsonAttribute(true)]
        public string description { get; set; }
        [UseForJsonAttribute(true)]
        public Person[] students { get; set; }
        [UseForJsonAttribute(true)]
        public Person teacher { get; set; }
    }
    public class Person
    {
        public Person() { }
        [UseForJsonAttribute(true)]
        public String Name { get; set; }
        [UseForJsonAttribute(true)]
        public Address Address { get; set; }
        [UseForJsonAttribute(true)]
        public int Age { get; set; }
    }
public class Address {
        [UseForJsonAttribute(true)]
        public string Country { get; set; }
        [UseForJsonAttribute(true)]
        public string Privince { get; set; }

        public int Num { get; set; }
}

json生成测试

代码语言:javascript
复制
 Address address1 = new Address();
            address1.Country = "china";
            address1.Privince = "shanghai";

            Address address2 = new Address();
            address2.Country = "china";
            address2.Privince = "beijjing";

            Address address3 = new Address();
            address3.Country = "china";
            address3.Privince = "anhui";

            Person person1 = new Person();
            person1.Name = "jake";
            person1.Age = 22;
            person1.Address = address1;

            Person person2 = new Person();
            person2.Name = "jake";
            person2.Age = 22;
            person2.Address = address1;

            Person person3 = new Person();
            person3.Name = "jake";
            person3.Age = 22;
            person3.Address = address1;

            Class class1 = new Class();
            class1.RoomID = 12;
            class1.teacher = person1;

            class1.students = new Person[5];
            class1.students[0] = person2;
            class1.students[1] = null;
            class1.students[2] = person3;
            class1.students[3] = null;
            class1.students[4] = person3;
            class1.description = "\\\'\".,sadwqqw\t\req\\we\n{}[]";
            ObjToJson<Class> json = new ObjToJson<Class>();
            this.textBox1.Text = json.ToJson(class1);

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档