JSONCoder是一个轻量级的通用的Java对象序列化和反序列化到JSON格式的工具包,类似Jackso或者FastJso。这个库在eBay内部广泛使用多年。这并非是要替代其他常用库,主要是解决了一些其他库中不被支持的特别问题。
一般的JSON库都有大量的参数,eBay单独再开发一个JSONCoder的原因是,如果我们用JSON来做配置文件的时候经常会受限于JSON标准的一些约束,但又不想使用放弃JSON改用YAML或者其他格式,那么你可以试试这个JSONCoder,该项目主要聚焦于解决如下问题:
支持JSON扩展建议(JSONEX),该扩展对用作配置用途的JSON比较友好,例如:支持注释key的引号是可选的可自定义引号字符(避免选择其他不同引号字符时不必要的转义)支持ES6的多行字符串语义配置文件的合并(例如:环境相关的配置覆盖常规配置)其次是JSONCoder支持通过检测循环对象引用来支持任意Java对象的序列化。你不需要单独再编写序列化器支持对配置信息设置合理的默认值,最小化注释或配置使用。例如,默认情况下,它会自动忽略未知属性以实现向前兼容性。专注于开发人员友好的API,同时还提供灵活的配置详细特性自动检测循环对象引用,并对引用进行序列化,避免堆栈溢出可以在getXXX方法中提供额外的配置来包含类的字段可插入式的自定义编码和解码器可插入式的过滤器来包含和排除特别的字段,基于特定的类型可配置过滤特定的类和子类以及字段可配置过滤某些特定类型属性,例如私有字段、枚举名称,只读字段等支持自定义日期格式以及在反序列化时自动解析在反序列化时通过$type属性支持类型的多态反序列化支持泛型反序列化的数据追加到已有的对象(增量解码,例如用来合并多个配置字段)支持嵌套的JSON字符串作为子JSON对象,避免不必要的字符串语义的转义支持向前兼容特性:静默忽略未知属性,使用@DefaultEum引用默认的枚举支持JSON扩展建议格式(JSONEX),查看示例要求JDK 1.7或者更新版本更多关于JSONCoder的配置项请看 JSONCoderOptio
测试示例请看 JSONCoderTest
使用方法Mave依赖<depedecy><groupId>com.ebay.jsocoder</groupId><artifactId>JSONCoder</artifactId><versio>${jsoCoderVersio}</versio></depedecy>Youcagetcurretversiobysearchig mavecetral简单的序列化和反序列化//serializatioJSONCoder.global.ecode(o)//de-serializatioSomeClassobj=JSONCoder.global.decode(str,SomeClass.class);字段和类的过滤JSONCoderOptioopt=ewJSONCoderOptio();//ForSomeClass1adit'ssub-classes,olyicludefield:"field1ForClass1","field2ForClass1"opt.getSimpleFilterFor(SomeClass1.class).setIclude(true).addProperties("field1ForClass1","field2ForClass1");//ForSomeClass2,excludefield:"fieldForClass2"opt.getSimpleFilterFor(SomeClass2.class).addProperties("fieldForClass2");//Forayclass,excludefield:"fieldIAyClass"opt.getDefaultFilter().addProperties("fieldIAyClass");//Excludecertaiclassesopt.addSkippedClasses(SomeExcludedClass.class);Strigresult=JSONCoder.ecode(bea,opt);泛型的反序列化Strigstr="['str1','str2','str3']";List<Strig>result=JSONCoder.global.decode(ewDecodeReq<List<Strig>>(){}.setSource(str));反序列并合并到已有对象(增量解码)TestBeabea=JSONCoder.global.decodeTo(jsoStr,bea);设置自定义的引号和自定义的缩进JSONCoderOptioopt=ewJSONCoderOptio();opt.getJsoOptio().setQuoteChar('`');opt.getJsoOptio().setIdetFactor(2);StrigjsoStr=JSONCoder.global.ecode(someObj,opt);注册自定义的编码器publicclassCoderBigItegerimplemetsICoder<BigIteger>{publicClass<BigIteger>getType(){returBigIteger.class;}@OverridepublicTDNodeecode(BigItegero,BeaCoderCotextcotext,TDNodetarget){returtarget.setValue(o.toStrig());}@OverridepublicBigItegerdecode(TDNodejsoNode,Typetype,BeaCoderCotextcotext){returewBigIteger((Strig)jsoNode.getValue());}}JSONCoderOptioopt=ewJSONCoderOptio().addCoder(ewCoderBigIteger());StrigjsoStr=JSONCoder.global.ecode(ewBigIteger("1234"),opt);
评论