JSONCoder 是一个轻量级的通用的 Java 对象序列化和反序列化到 JSON 格式的工具包,类似 Jackson 或者 FastJson。这个库在 eBay 内部广泛使用多年。这并非是要替代其他常用库,主要是解决了一些其他库中不被支持的特别问题。
一般的 JSON 库都有大量的参数,eBay 单独再开发一个 JSONCoder 的原因是,如果我们用 JSON 来做配置文件的时候经常会受限于 JSON 标准的一些约束,但又不想使用放弃 JSON 改用 YAML 或者其他格式,那么你可以试试这个 JSONCoder,该项目主要聚焦于解决如下问题:
更多关于 JSONCoder 的配置项请看 JSONCoderOption
测试示例请看 JSONCoderTest
Maven 依赖
com.ebay.jsoncoder JSONCoder ${jsonCoderVersion}
You can get current version by searching maven central
简单的序列化和反序列化
// serialization JSONCoder.global.encode(o) // de-serialization SomeClass obj = JSONCoder.global.decode(str, SomeClass.class);
字段和类的过滤
JSONCoderOption opt = new JSONCoderOption(); // For SomeClass1 and it’s sub-classes, only include field: “field1ForClass1”, “field2ForClass1” opt.getSimpleFilterFor(SomeClass1.class).setInclude(true).addProperties(“field1ForClass1”, “field2ForClass1”); // For SomeClass2, exclude field: “fieldForClass2” opt.getSimpleFilterFor(SomeClass2.class).addProperties(“fieldForClass2”); // For any class, exclude field: “fieldInAnyClass” opt.getDefaultFilter().addProperties(“fieldInAnyClass”); // Exclude certain classes opt.addSkippedClasses(SomeExcludedClass.class); String result = JSONCoder.encode(bean, opt);
泛型的反序列化
String str = “[‘str1’, ‘str2’, ‘str3’]”; List result = JSONCoder.global.decode(new DecodeReq>(){}.setSource(str));
反序列并合并到已有对象(增量解码)
TestBean bean = JSONCoder.global.decodeTo(jsonStr, bean);
设置自定义的引号和自定义的缩进
JSONCoderOption opt = new JSONCoderOption(); opt.getJsonOption().setQuoteChar(‘`’); opt.getJsonOption().setIndentFactor(2); String jsonStr = JSONCoder.global.encode(someObj, opt);
注册自定义的编码器
public class CoderBigInteger implements ICoder{ public Class getType() {return BigInteger.class;}
@Override public TDNode encode(BigInteger o, BeanCoderContext context, TDNode target) { return target.setValue(o.toString()); }
@Override public BigInteger decode(TDNode jsonNode, Type type, BeanCoderContext context) { return new BigInteger((String)jsonNode.getValue()); } } JSONCoderOption opt = new JSONCoderOption() .addCoder(new CoderBigInteger()); String jsonStr = JSONCoder.global.encode(new BigInteger(“1234”), opt);