Skip to content

blqw/blqw.Json

Repository files navigation

blqw.Json 一个优秀的Json序列化类库

Json序列化与反序列化
3.0重构,大幅度增加可拓展性,性能有所下降,后续优化
http://cnblogs.com/blqw/p/json.html
使用方便 ,性能卓越

3.0可以很方便的重定义某个类的序列化行为

class TestClass2
{
    public Regex Regex { get; set; }
}

class TestClass2Writer : IJsonWriter
{
    public Type Type => typeof(TestClass2);
    public void Write(object obj, JsonWriterArgs args)
    {
        var o = (TestClass2)obj;
        args.Writer.Write($"\"Regex\":/{o.Regex.ToString()}/g");
    }
}

static void Main(string[] args)
{
    var t2 = new TestClass2()
    {
        Regex = new Regex("^[0-9]{4,6}$") 
    };
    var str2 = t2.ToJsonString();  //{"Regex":/^[0-9]{4,6}$/g}
    Console.WriteLine(str2);
}

输出: {"Regex":/^[0-9]{4,6}$/g}
另一种简单的方式

class TestClass1 : IObjectReference
{
    public int ID { get; set; }
    public string Name { get; set; }
            
    public object GetRealObject(StreamingContext context)
    {
        if (context.Context is JsonWriterArgs)
        {
            return new {id = this.ID, name = this.Name};
        }
        return this;
    }
}
static void Main(string[] args)
{
    var t1 = new TestClass1()
    {
        ID = 1,
        Name = "blqw",
    };
    var str1 = t1.ToJsonString();  //{"id":1,"name":"blqw"}
    Console.WriteLine(str1);
}

输出: { "id":1,"name":"blqw"}

blqw.Json.ToJsonString(object);  
blqw.Json.ToObject<T>(string);  
blqw.Json.ToObject(string);  
blqw.Json.ToObject(Type,string);  
//2014.07.29 新增  
blqw.Json.ToJsonObject(string);  
//2014.08.08 新增  
blqw.Json.ToJsonString(object,JsonBuilderSettings);  
//2014.10.25 新增  
blqw.Json.ToDynamic(string);  

##更新说明

[3.1.3.3] 2016.12.19

  • 更新依赖组件

[3.1.3.1] 2016.11.24

  • 重新上传到nuget,修复nuget下载没有dll的问题

[3.1.3] 2016.11.16

  • 优化动态类型的处理

[3.1.2] 2016.11.04

  • 更新blqw.IOCblqw.Convert3升级到最新正式版
  • 版本更新到正式版

[3.1.2-beta] 2016.10.07

  • 更新blqw.IOCblqw.Convert3

[3.1.1.1] 2016.10.13

  • 修复某些特殊情况下报空引用的问题

[3.0.6] 2016.08.16

  • 修复Guid的默认行为,带有连字符

[3.0.5] 2016.08.10

  • 3.0重构,大幅度增加可拓展性,性能有所下降,后续优化

2016.07.13

  • 修复反斜杠序列化失败的问题

2016.07.05

  • 为了更好的兼容性,加入组件 blqw.Convert3

2016.06.29

  • 优化对键值对枚举器的支持

2016.04.15

  • 更新MEF

2016.04.08

  • 新增可以将255以上的字符序列化为unicode编码

2016.04.05

  • 根据Json官方文档对转义符进行优化
  • 序列化支持官方转义符:"\" \\ \/ \b \f \n \r \t 其他控制类字符转为\u****
  • 反序列化支持官方转义符同上,另外支持非官方转义符 \0 \a \v \'

2016.03.31

  • 新增 ToStringJson 可选择过滤特殊字符的功能

2016.03.16

  • 更新EMF组件

2016.03.03

  • 优化反序列化时的产生太多垃圾对象问题

2016.02.21

  • 优化IoC模块

2015.11.06

  • 改为可独立运行,辅助功能依靠IoC插件方式加载

2015.06.21

  • 重新设计 Dynamic 类型的实现方式,现在可以将属性区分大小写,可以在运行时正确推断类型
  • 取消 IJsonObject 接口
  • 取消 ILoadJson 接口

2015.06.13

  • 增加序列化时可以选择输出类型信息的选项,反序列化的时候可以优先尝试序列化为指定的对象

2015.06.10

  • 优化类型转换部分,全面采用convert3组件方案,修改部分代码
  • 小幅度优化字符串拼接部分的性能

2014.12.21

  • 优化IgnoreNullMember的处理方式,现在可以正确的忽略Dictionary或者DataTable中空的属性

2014.12.20

  • 优化IList的序列化性能
  • 优化IJsonObject,现在实现它也必须现实IEnumerable<IJsonObject>接口,所以可以直接foreach操作
  • 新增2个接口IToJson,ILoadJson允许对象自定义序列化和反序列化的部分行为
  • 同步更新Literacy,增加2个转换全半角的方法

2014.12.03

  • 修正void AppendDataReader(IDataReader reader)方法命名错误的问题(一直写成void AppendDataSet(IDataReader reader))
  • 修正 序列化IDataReader 时的数据,为[{"columnName1":"value1","columnName2":"value2"},{"columnName1":"value3","columnName2":"value4"}](之前是{"columns":["columnName1","columnName2"],"values":[["value1","value2"],["value3","value4"]]})

2014.11.28

  • 更新一处bug在序列化-10的时候会出现错误 感谢网友@孩子,抬起头

2014.10.27

  • 完美解决了,引用项目的问题

2014.10.25

  • 感谢 @冲动 让我有了灵感,现在可以支持dynamic了
  • 因为blqw.Json项目是2.0开发的,如果4.0项目引用可以使用dynamic,否则会抛出"dynamic类型加载失败!"的异常
	var str = "{ Name : \"blqw\", Age : 11 ,Array : [\"2014-1-1 1:00:00\",false,{ a:1,b:2 }] }";
	dynamic json = Json.ToDynamic(str);
	Console.WriteLine(json.Name);
	Console.WriteLine(json.Age);
	Console.WriteLine(((DateTime)json.Array[0]).ToShortDateString());
	Console.WriteLine(((bool)json.Array[1]) == false);
	Console.WriteLine(json.Array[2].a);
	Console.WriteLine(json.Array[2].b);

2014.09.14

  • 同步更新 [blqw.Literacy]

2014.08.31

  • 优化类型转换,性能up!

2.0b1 版本发布

2014.09.10

  • 更新Literacy组件中一处兼容问题,在某些版本的windows下会造成初始化失败的问题

2014.09.09

  • 同步更新Literacy组件
  • 更新两处序列化错误的问题

2014.08.08

  • 优化代码 :
    1. 放弃直接使用JsonBuilder ,现在JsonBuilder仅作为抽象基类存在
    2. 放弃使用Dictionary检测循环引用,改为ArrayList,测试表明这种方式更快
    3. 当不检测循环引用的时候,当对象层级超过30将会抛出异常
    4. IJsonObject 增加属性 Object Value { get; }
    5. 增加JsonType 和 JsonMember 两个对象,用于缓存C#和Json对象转换的相关信息
    6. 优化JsonParser中大部分代码逻辑,更清晰和高效
    7. 增加StringConverter用于将String转换为任意对象
    8. 减少GC的回收消耗
    9. 修改其他代码和bug
  • 增加对特性的支持,现有3个特性JsonFormatAttribute(自定义格式化),JsonIgnoreAttribute(忽略),JsonNameAttribute(自定义json名称)
  • 增加序列化参数 JsonBuilderSettings,包括 时间/布尔/枚举的默认格式,是否序列化字段,数字/布尔是否加引号,是否检测循环引用,是否忽略null值等
  • 修改DataTable对象的默认Json格式为常用格式

2014.07.29

  • 新增 IJsonObject 类型
User user = User.TestUser();
IJsonObject jobj = Json.ToJsonObject(Json.ToJsonString(user));
Console.WriteLine(user.Name == jobj["Name"].ToString());
Console.WriteLine(user.LoginHistory[0] == Convert.ToDateTime(jobj["LoginHistory"][0]));
Console.WriteLine(user.Info.Phone["手机"] == jobj["Info"]["Phone"]["手机"].ToString());

2014.07.24

  • 优化性能
  • 优化代码结构
  • 修正AppendChar方法中的BUG
  • 增加对特殊字符 \a,\b,\v,\f 的处理

2014.07.23

  • 修正几处关于时间类型的已知BUG
  • 增加单元测试,测试数据与Newtonsoft对比
  • 版本号:1.14.0723
  • 接下来准备2.x版本的开发工作
  • 预计新功能有 支持dynamic,支持Attribute,支持几种预定格式切换,新增JsonObject对象

About

Json serialization and deserialization

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages