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

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);

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

时间: 2024-11-12 05:23:54

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

&quot;菜鸟&quot;与大神程序员之间的差别(转载)

前段时间看到一篇文章,写得很好,针对菜鸟与大神之间的差别做了很客观.很透彻的分析,现在将文章转载过来,原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=239356&highlight=%E8%8F%9C%E9%B8%9F “菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术 的东西.首先请您先想想这几个问题.现在社会上有很多程序员,CSDN就是我们程序员的家,那您是否可想过程序员为什么会有

学会思考--菜鸟程序员晋升大神之路

"菜鸟"和"大神" 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,那您是否可想过程序 员为什么会有不同的水平?你又是哪一类的程序员?"菜鸟"程序员和"大神"程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的说程序员分为"菜鸟"

“菜鸟”程序员和“大神”程序员差距在哪里

“菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,CSDN就是我们程序员的家,那您是否可想过程序员为什么会有不同的水平?你又是哪一类的程序员?“菜鸟”程序员和“大神”程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的说程序员分为“菜鸟”程序员和“大神”程序员. 一个程序员有多优秀,就得看他写的代码!

大学里如何成为技术大神

本文由PurpleSword(jzj1993)原创,转载请注明.原文网址 http://blog.csdn.net/jzj1993 总是有同学问我怎么学很多技术,好奇如何成为所谓的大神. 事实上,这篇文章是结合我的一些经历,讲述应该怎么学习技术,并不是要讲怎么成为大神.没有所谓的成功学,只有充满智慧的思考,脚踏实地的实干,和越来越近的理想,还有机遇和运气.之所以用这个标题,无非是吸引更多人.尤其是很多对成为大神抱有不切实际的幻想的人来看.希望读者能从中得到一些东西,没有浪费看这篇文的时间.这篇文

菜鸟”和“大神”

菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术 的东西.首先请您先想想这几个问题.现在社会上有很多程序员,CSDN就是我们程序员的家,那您是否可想过程序员为什么会有不同的水平?你又是哪一类的程 序员?“菜鸟”程序员和“大神”程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的说程序员分为“菜鸟”程序员和“大神”程序员. 一个程序员有多优秀,就得看他写的代码

【转】“菜鸟”程序员和“大神”程序员差距在哪里

努力做大神程序猿,下面的文章真的说到通点了,最近就在思考这个问题,马上工作五年了略迷惘了.加油,尽快调整好自己 “菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,那您是否可想过程序员为什么会有不同的水平?你又是哪一类的程序员?“菜鸟”程序员和“大神”程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的

程序员:“菜鸟”和“大神”差距在哪

“菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,那您是否可想过程序员为什么会有不同的水平?你又是哪一类的程序员?“菜鸟”程序员和“大神”程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的说程序员分为“菜鸟”程序员和“大神”程序员. 一个程序员有多优秀,就得看他写的代码!程序员自己的代码才是自己工作

在大神的世界里

21世纪,到处都是大神. 我的班主任就是一枚大神,有着技术人明显的特点.诸如:每天都会看博文,关注科技新闻,坚持学习,最重要的是,把自己学知道的知识毫无保留地传授给学生.我时常是这样想的,作为一名技术人,一定是深感到了我国的科技的瓶颈所在,一定是希望有更多的人加入到科技潮流中来振兴我国科技业. 起初我还以为像老师这样的人应该不多了,后来我发现我错了,网上有很多的大神,有很多的志同道合的小伙伴们,一方面除了是为工作考虑外,另一方面还是希望有更多的人一起来振兴我国科技的,当然我也是其中一个,只是我还

大神手把手教你写一个页面模板引擎,只需20行Javascript代码!

只用20行Javascript代码就写出一个页面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,转需. 不知道你有木有听说过一个基于Javascript的Web页面预处理器,叫做AbsurdJS.我是它的作者,目前我还在不断地完善它.最初我只是打算写一个CSS的预处理器,不过后来扩展到了CSS和HTML,可以用来把Javascript代码转成CSS和HTML代码.当然,由于可以生成HTML代码,你也可以把它当成一个模板引擎,用于在标记语言中填充数据. 于是我又想着能不能写一些简单的代