博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个农民工写的Json组件,让大神们情何以堪.
阅读量:6766 次
发布时间:2019-06-26

本文共 8677 字,大约阅读时间需要 28 分钟。

 博客园不让上传文件,我放在百度网盘了

废话少说,直接上图

 

测试代码

using System;#region#endregionnamespace 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#endregionnamespace 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
最近登录记录 { 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
(15);//这里假设保留半个月的登录记录 for(int i = 0; i < 15; i++) 最近登录记录.Add(DateTime.Today.AddDays(i)); 用户信息 = new UserInfo(); 用户信息.邮政编码 = 888888; 用户信息.联系地址 = "山东省\r\n青岛市"; 用户信息.联系方式 = new Dictionary
(); 用户信息.联系方式.Add("手机", "18818181018"); 用户信息.联系方式.Add("电话", "3838438"); 用户信息.联系方式.Add("QQ", "123456"); } public enum UserSex { 男, 女, 人妖 } public class UserInfo { public int 邮政编码 { get; set; } public string 联系地址 { get; set; } public Dictionary
联系方式 { get; set; } } }}

 

测试代码最好你自己写

 

Crylw.Json优点

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

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

[Flags]    public enum JsonWriterSettings {        None = 0,        ///忽略值是null的属性        IgnoreNull = 1,        ///格式化输出字符串        FormatOutput = 1 << 1,        ///将枚举转为对应的数字值        EnumToNumber = 1 << 2,        ///将布尔值转为数字值 true = 1,false = 0        BooleanToNumber = 1 << 3,        ///将DateTime 对象转为从 1970年1月1日开始计算到 DateTime 对象之间的毫秒数        DateTimeToNumber = 1 << 4,        ///单引号模式        SingleQuotesMode = 1 << 5,        ///同时序列化字段        SerializableField = 1 << 6,        ///同时序列化静态属性        SerializableStatic = 1 << 7,        ///检查循环引用,发现循环引用时输出 undefined        CheckLoopReference = 1 << 8,        ///同时序列化私有属性        SerializablePrivate = 1 << 9,        ///将单引号编码为\u0027 双引号编码为\u0022        EncodeQuotesToUnicode = 1 << 10,        ///默认序列化设置        Default = EnumToNumber | BooleanToNumber,        ///调试序列化设置        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);            //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
,object[]); jw.ObjectEnd();

5.支持流

var jw = new JsonWriter(TextWriter);

 

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

 

转载于:https://www.cnblogs.com/crylw/p/4598070.html

你可能感兴趣的文章
Exchange 2013服务器常用的性能监视器
查看>>
详解linux运维工程师入门级必备技能
查看>>
dvi转vga接口图及相关接法
查看>>
大型网络初试题
查看>>
邮件系统5大绝招解决中毒难题!!!
查看>>
Linux共享库注入后门
查看>>
【SQL Server学习笔记】XML、分层、空间数据
查看>>
ElsticStake安装之Logstash6.4.0 安装(二)
查看>>
android 资源
查看>>
DB2 常用命令大全【转】
查看>>
XenServer安装最佳实践
查看>>
windows 2003 dhcp服务器,主机移动vlan获取原理ip
查看>>
Android 学习--ListView 的使用(四)
查看>>
基于MDK编译器 STM32与12864液晶显示程序 和电路连接
查看>>
启动apache 提示命令不存在
查看>>
汽车硬件backdoor生成器
查看>>
Windows下安装的XAMPP如何设置Apache和MySQL等服务开机自启动
查看>>
在redhat系统如何设置支持NTFS系统文件并开机自动挂载
查看>>
linux安装rzsz(lrzsz)
查看>>
Python中_,__,__xx__的区别
查看>>