码迷,mamicode.com
首页 > Web开发 > 详细

一个农民工写的Json组件,让大神们情何以堪.

时间:2015-06-24 18:32:22      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

dll下载地址 博客园不让上传文件,我放在百度网盘了

废话少说,直接上图

技术分享

 

测试代码

using System;

#region

#endregion

namespace Crylw.Json.Demo {
    [Debug]
    partial class DebugJsonWriter {
        static DebugWriter dw = debug.Output;
        static DebugUserInfo user = new DebugUserInfo(true);

        //[Debug]
        static void 常规测试() {
            dw.AppendLine().Append(ConsoleColor.Magenta, "这是我写的 Crylw.Json").AppendLine();
            dw.Append(Json.ToString(user, true)).AppendLine();

            //dw.AppendLine().Append(ConsoleColor.Magenta, "大名鼎鼎的 Newtonsoft.Json").AppendLine();
            //dw.Append(Newtonsoft.Json.JsonConvert.SerializeObject(user, Newtonsoft.Json.Formatting.Indented)).AppendLine();

            //dw.AppendLine().Append(ConsoleColor.Magenta, "淘宝使用的 Jayrock.Json").AppendLine();
            //var writer = new Jayrock.Json.JsonTextWriter();
            //Jayrock.Json.Conversion.JsonConvert.Export(user, writer);
            //dw.Append(writer.ToString()).AppendLine();

            //dw.AppendLine().Append(ConsoleColor.Magenta, "号称最快的 fastJson").AppendLine();
            //var p = new fastJSON.JSONParameters();
            //p.EnableAnonymousTypes
            //    = p.IgnoreCaseOnDeserialize
            //    = p.ShowReadOnlyProperties
            //    = p.UseEscapedUnicode
            //    = p.UseExtensions
            //    = p.UseFastGuid
            //    = p.UseOptimizedDatasetSchema
            //    = p.UseUTCDateTime
            //    = p.UsingGlobalTypes
            //    = false;
            //dw.Append(fastJSON.JSON.Instance.ToJSON(user, p)).AppendLine();

            //dw.AppendLine().Append(ConsoleColor.Magenta, "非常优秀的 blqw.Json").AppendLine();
            //dw.Append(blqw.Json.ToJsonString(user)).AppendLine();

            //dw.AppendLine().Append(ConsoleColor.Magenta, "微软官方的 JavaScriptSerializer").AppendLine();
            //dw.Append(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(user)).AppendLine();
        }
        [Debug]
        static void Json序列化对比测试() {
            var ex = CodeTimer.CreateCodeTimerList();

            ex.Add(new CodeTimer("大名鼎鼎的 Newtonsoft.Json", () => {
                Newtonsoft.Json.JsonConvert.SerializeObject(user);
            }));
            ex.Add(new CodeTimer("微软官方的 JavaScriptSerializer", () => {
                new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(user);
            }));
            ex.Add(new CodeTimer("淘宝使用的 Jayrock.Json", () => {
                var writer = new Jayrock.Json.JsonTextWriter();
                Jayrock.Json.Conversion.JsonConvert.Export(user, writer);
                writer.ToString();
            }));
            ex.Add(new CodeTimer("号称最快的 fastJson", () => {
                fastJSON.JSONParameters p = new fastJSON.JSONParameters();
                p.EnableAnonymousTypes
                    = p.IgnoreCaseOnDeserialize
                    = p.ShowReadOnlyProperties
                    = p.UseEscapedUnicode
                    = p.UseExtensions
                    = p.UseFastGuid
                    = p.UseOptimizedDatasetSchema
                    = p.UseUTCDateTime
                    = p.UsingGlobalTypes
                    = false;
                fastJSON.JSON.Instance.ToJSON(user, p);
            }));
            //ex.Add(new CodeTimer("非常优秀的 blqw.Json", () => {
            //    blqw.Json.ToJsonString(user);
            //}));
            ex.Add(new CodeTimer("杨辉写的 Crylw.Json", () => {
                Json.ToString(user);
            }));

            ex.Start(debug.name());
            ex.Time(1, 500, 1000, 5000, 10000);
            ex.End();
        }
    }
}
using System;
using System.Collections.Generic;

#region

#endregion

namespace Crylw {
    public class DebugUserInfo {
        public string 用户名 { get; set; }
        public string 真实姓名 { get; set; }
        public string 密码 { get; set; }
        public uint 年龄 { get; set; }
        public int 收入 { get; set; }
        public byte[] 头像 { get; set; }
        public UserSex 性别 { get; set; }
        public bool 会员 { get; set; }
        public Guid 标识 { get; set; }
        public double 版本 { get; set; }

        public UserInfo 用户信息 { get; set; }
        public List<DateTime> 最近登录记录 { get; set; }

        public DebugUserInfo() {
        }
        public DebugUserInfo(bool init) {
            用户名 = "牛B";
            真实姓名 = "还是牛B";
            密码 = "你猜";
            年龄 = 18;
            收入 = -10000;
            头像 = new byte[64];//这里假设头像的图片占64字节
            for(byte i = 0; i < 64; i++) 头像[i] = i;

            性别 = UserSex.人妖;
            会员 = false;
            标识 = Guid.NewGuid();
            版本 = 123.456;


            最近登录记录 = new List<DateTime>(15);//这里假设保留半个月的登录记录
            for(int i = 0; i < 15; i++) 最近登录记录.Add(DateTime.Today.AddDays(i));

            用户信息 = new UserInfo();
            用户信息.邮政编码 = 888888;
            用户信息.联系地址 = "山东省\r\n青岛市";
            用户信息.联系方式 = new Dictionary<string, string>();
            用户信息.联系方式.Add("手机", "18818181018");
            用户信息.联系方式.Add("电话", "3838438");
            用户信息.联系方式.Add("QQ", "123456");
        }
        public enum UserSex {
            男,
            女,
            人妖
        }
        public class UserInfo {
            public int 邮政编码 { get; set; }
            public string 联系地址 { get; set; }
            public Dictionary<string, string> 联系方式 { get; set; }
        }
    }
}

 

测试代码最好你自己写

 

Crylw.Json优点

1.高效,看上图就知道了

2.简单,Json.ToString(任意对象);支持循环引用

[Flags]
    public enum JsonWriterSettings {
        None = 0,

        ///<summary>忽略值是null的属性</summary>
        IgnoreNull = 1,
        ///<summary>格式化输出字符串</summary>
        FormatOutput = 1 << 1,
        ///<summary>将枚举转为对应的数字值</summary>
        EnumToNumber = 1 << 2,
        ///<summary>将布尔值转为数字值 true = 1,false = 0</summary>
        BooleanToNumber = 1 << 3,
        ///<summary>将DateTime 对象转为从 1970年1月1日开始计算到 DateTime 对象之间的毫秒数</summary>
        DateTimeToNumber = 1 << 4,
        ///<summary>单引号模式</summary>
        SingleQuotesMode = 1 << 5,
        ///<summary>同时序列化字段</summary>
        SerializableField = 1 << 6,
        ///<summary>同时序列化静态属性</summary>
        SerializableStatic = 1 << 7,
        ///<summary>检查循环引用,发现循环引用时输出 undefined</summary>
        CheckLoopReference = 1 << 8,
        ///<summary>同时序列化私有属性</summary>
        SerializablePrivate = 1 << 9,
        ///<summary>将单引号编码为\u0027 双引号编码为\u0022</summary>
        EncodeQuotesToUnicode = 1 << 10,

        ///<summary>默认序列化设置</summary>
        Default = EnumToNumber | BooleanToNumber,
        ///<summary>调试序列化设置</summary>
        Debug = FormatOutput | CheckLoopReference | SerializableField | SerializableStatic | SerializablePrivate
    }

3.高扩展性

你写个类实现IToJson接口,性能再提升50%

    class DebugUserInfo2: DebugUserInfo, IToJson {
        public void WriteTo(JsonWriter jw) {
            jw.ObjectStart();
                jw.RawName("用户名").RawValue(用户名);
                jw.RawName("真实姓名").RawValue(真实姓名);
                jw.RawName("密码").RawValue(密码);
                jw.RawName("年龄").Value(年龄);
                jw.RawName("收入").Value(收入);
                jw.RawName("头像").Value(头像);
                jw.RawName("性别").Value(性别);
                jw.RawName("会员").Value(会员);
                jw.RawName("标识").Value(标识.ToString());
                jw.RawName("版本").Value(版本);
                jw.RawName("用户信息").ObjectStart();
                    jw.RawName("邮政编码").Value(用户信息.邮政编码);
                    jw.RawName("联系地址").Value(用户信息.联系地址);
                    jw.RawName("联系方式").ObjectStart();
                        foreach(var kvp in 用户信息.联系方式) {
                            jw.RawName(kvp.Key); jw.RawValue(kvp.Value);
                        };
                    jw.ObjectEnd();
                jw.ObjectEnd();
                jw.RawName("近登录记录").ArrayStart();
                    foreach(var item in 最近登录记录) jw.Value(item);
                jw.ArrayEnd();
            jw.ObjectEnd();
        }
    }

你无法控制的类,给它写个适配器,性能还是提升50%

    class NameValueCollectionAdapter: JsonWriterAdapter {
        public override void WriteTo(JsonWriter jw, object value) {
            jw.ObjectStart();
            var nvc = value as NameValueCollection;
            var keys = nvc.AllKeys;
                for(int i = 0; i < keys.Length; i++) {
                    jw.Name(keys[i]).Value(nvc[i]);
                };
            jw.ObjectEnd();
        }
    }

然后

JsonWriterAdapter.Add(typeof(NameValueCollection), new NameValueCollectionAdapter());

就OK了, NameValueCollection 已经原生支持了,常用类型大部分都原生支持了

4.模拟继承

            var jw = new JsonWriter();
            jw.ArrayStart();
            //jw.Concat(object[]);
            //jw.Concat(List<object>);
            //jw.Concat(DataTable);
            //jw.Concat(IDataReader);
            jw.ArrayEnd();

            jw.ObjectStart();
            //jw.Extend(DataSet);
            //jw.Extend(DataRow);
            //jw.Extend(IDictionary);
            //jw.Extend(NameValueCollection);
            //jw.Extend(List<string>,object[]);
            jw.ObjectEnd();

5.支持流

            var jw = new JsonWriter(TextWriter);

 

好了,今天就到这里,该接女儿放学了

 

一个农民工写的Json组件,让大神们情何以堪.

标签:

原文地址:http://www.cnblogs.com/crylw/p/4598070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!