GithubHelp home page GithubHelp logo

catimmortal / catjson Goto Github PK

View Code? Open in Web Editor NEW
235.0 3.0 28.0 827 KB

为Unity开发者量身打造的Json库,内置ILRuntime支持

License: MIT License

C# 100.00%
unity csharp json ilruntime deserializer serializer

catjson's Introduction

简介

为Unity开发者量身打造的Json库,内置ILRuntime支持

在内存分配,CPU耗时上都达到了一个较好的水准

源码架构十分精简易读,可方便的按需求进行扩展修改

QQ交流群:762036315

性能对比

反序列化Json文本为自定义数据类型:

将自定义数据类型序列化为Json文本:

功能介绍

  • 支持Json文本与通用Json对象间的转换

    JsonObject jo = JsonParser.Default.ParseJson<JsonObject>(jsonText);
    string jsonText = JsonParser.Default.ToJson(jo);
    
    //或者使用扩展方法的形式
    JsonObject jo = jsonText.ParseJson<JsonObject>();
    string jsonText = jo.ToJson();
  • 支持Json文本与自定义数据对象间的转换

    CustomData data = JsonParser.Default.ParseJson<CustomData>(jsonText);
    string jsonText = JsonParser.Default.ToJson<CustomData>(data);
    
    //或者使用扩展方法的形式
    CustomData data = jsonText.ParseJson<CustomData>();
    string jsonText = data.ToJson();
  • 基础数据类型支持byte,sbyte,short,ushort,int,uint,long,ulong,float,double,decimal,char

  • 支持自定义枚举类型,会作为string进行转换

  • 数据容器类型支持字典、数组、List,其中字典key的类型除了string外还支持任意数字类型与枚举类型

    注意:支持三者的互相嵌套,但对于数组套数组的情况只支持锯齿数组不支持多维数组

  • 支持Json文本与数据容器类型间的转换

    int[] nums =  JsonParser.Default.ParseJson<int[]>("[1,2,3]");
  • 支持各种Unity特有数据类型,如Vector2/3/4,Quaternion,Color,Bounds,Rect,Keyframe,AnimationCurve等

  • 序列化为Json文本时支持格式化

    可通过设置JsonParser.Default.IsFormat = false关闭格式化序列化

  • 支持多态序列化/反序列化

    可通过设置JsonParser.Default.IsPolymorphic = false关闭多态序列化/反序列化

  • 支持使用者通过自定义JsonFormatter指定某个类型的转换方式

    调用JsonParser.AddCustomJsonFormatter(Type type, IJsonFormatter formatter)即可注册指定类型的自定义Formatter

  • 支持使用JsonIgnore特性标记想要忽略的字段/属性

    对于无法通过修改源码进行标记的字段/属性,可通过调用JsonParser.AddIgnoreMember(Type type, string memberName)进行忽略

  • 支持使用JsonKey特性自定义序列化/反序列化时的Key名称

    对于无法通过修改源码进行自定义JsonKey的字段/属性,可通过调用JsonParser.SetJsonKey(Type type, string key, FieldInfo fi)JsonParser.SetJsonKey(Type type, string key, PropertyInfo fi)进行自定义

  • 定义了IJsonParserCallbackReceiver接口,为使用者提供序列化前的回调OnToJsonStart和反序列化后的回调OnParseJsonEnd,以处理其他特殊情况

  • 支持使用ILRuntime时对于热更层类型的序列化/反序列化,使用FUCK_LUA宏即可一键开启对ILRuntime的适配

    注意:如果要在热更层调用ToJson或ParseJson的泛型版本,需要在ILRuntime初始化时调用ILRuntimeHelper.RegisterILRuntimeCLRRedirection注册CatJson的CLR重定向

注意事项

  • JsonParser.Default表示默认Json解析器对象,若需要创建不同Parser实例,可通过JsonParser jsonParserObject = new JsonParser()创建,不同实例不共享配置设置
  • 默认只会对公有的实例字段/属性(且属性必须同时具有get/set)进行序列化/反序列化,可通过调用JsonParser.SetBindingFlags(BindingFlags bindingFlags)来修改BindingFlags
  • 对于字段/属性而言,如果其值为null,false或0,那么为了性能考虑将不会对该字段/属性进行序列化(可以通过JsonParser.Default.IgnoreDefaultValue = false全局关闭此项设置,或针对指定类型标记JsonCareDefaultValue特性进行局部关闭)

相关文章

CatJson开发总结

CatJsonV2开发总结

catjson's People

Contributors

catimmortal avatar fingercaster avatar wang-er-s avatar xhaoh94 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

catjson's Issues

bool类型序列化错误

public class Test
{
public bool boolVal = true;
public int intVal = 3;
}

Test t = new Test();
t.boolVal = false;
t.intVal = 99;
var json = CatJson.JsonParser.ToJson(t);
Debug.Log(json);
/* 输出
{
"intVal":99
}
/
var lt = CatJson.JsonParser.ParseJson(json);
Debug.Log(lt.boolVal+" " + lt.intVal);
/
输出
True 99
*/
上面boolVal值改成了false 反序列化时值是True

多态序列化格式的疑问

image
看到多态序列化的ToJson步骤,除了1.0版本的RealTypeKey外,额外加入了一层objectKey,实际的对象序列化文本在objectKey对应的value中。
虽然可以理解是为了做多态序列化、反序列化的流程方便,但是这样会导致对象序列化后的json文本没办法在非CatJson环境下被正确反序列化解析(例如客户端ToJson后发送给服务端)

字典不支持枚举为Key吗

///


/// 对比Type是否为同一类型的Type
///

public static bool TypeEquals(Type t1, Type t2)
{
#if FUCK_LUA
t1 = CheckType(t1);
t2 = CheckType(t2);
#endif
return t1 == t2;
}
这个类型判断,如果key是枚举对话,是为非intkey的,会报错

变量作用域问题

hi
偶然发现这个库,在测试 自定义解析器 的过程中发现一个问题,如下:

image

在自定义反序列化时,取值需要用到 Lexer, 但是它的使用范围限定在 internal.

也就是说在反序列化时,在现有设计下是没办法取到值的.

序列化保留

对于字段/属性而言,如果其值为null,false或0,那么为了性能考虑将不会对该字段/属性进行序列化
JsonParser.ToJson 时能加个开关保留 其值为null,false或0 的字段或属性吗
某些情况下可能会用到,比如导出一些游戏设置后,我想要手动把值为false改为true的时,这个字段没了。。还得手动把字段名加上

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.