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