JSONCoder

eBay 的 JSON 编码解码库
授权协议 MIT
开发语言 Java
所属分类 Web应用开发、 JSON/BSON开发包
软件类型 开源软件
地区 不详
投 递 者 贺子昂
操作系统 跨平台
开源组织 eBay
适用人群 未知
 软件概览

JSONCoder 是一个轻量级的通用的 Java 对象序列化和反序列化到 JSON 格式的工具包,类似 Jackson 或者 FastJson。这个库在 eBay 内部广泛使用多年。这并非是要替代其他常用库,主要是解决了一些其他库中不被支持的特别问题。

一般的 JSON 库都有大量的参数,eBay 单独再开发一个 JSONCoder 的原因是,如果我们用 JSON 来做配置文件的时候经常会受限于 JSON 标准的一些约束,但又不想使用放弃 JSON 改用 YAML 或者其他格式,那么你可以试试这个 JSONCoder,该项目主要聚焦于解决如下问题:

  • 支持 JSON 扩展建议 (JSONEX) ,该扩展对用作配置用途的 JSON 比较友好,例如:
    • 支持注释
    • key 的引号是可选的
    • 可自定义引号字符(避免选择其他不同引号字符时不必要的转义)
    • 支持 ES6 的多行字符串语义
    • 配置文件的合并 (例如:环境相关的配置覆盖常规配置)
  • 其次是 JSONCoder 支持通过检测循环对象引用来支持任意 Java 对象的序列化。你不需要单独再编写序列化器
  • 支持对配置信息设置合理的默认值,最小化注释或配置使用。例如,默认情况下,它会自动忽略未知属性以实现向前兼容性。
  • 专注于开发人员友好的API,同时还提供灵活的配置

详细特性

  • 自动检测循环对象引用,并对引用进行序列化,避免堆栈溢出
  • 可以在 getXXX 方法中提供额外的配置来包含类的字段
  • 可插入式的自定义编码和解码器
  • 可插入式的过滤器来包含和排除特别的字段,基于特定的类型
  • 可配置过滤特定的类和子类以及字段
  • 可配置过滤某些特定类型属性,例如私有字段、枚举名称,只读字段等
  • 支持自定义日期格式以及在反序列化时自动解析
  • 在反序列化时通过 $type 属性支持类型的多态
  • 反序列化支持泛型
  • 反序列化的数据追加到已有的对象(增量解码,例如用来合并多个配置字段)
  • 支持嵌套的 JSON 字符串作为子 JSON 对象,避免不必要的字符串语义的转义
  • 支持向前兼容特性:静默忽略未知属性,使用 @DefaultEnum 引用默认的枚举
  • 支持 JSON 扩展建议格式 (JSONEX), 查看示例
  • 要求 JDK 1.7 或者更新版本

更多关于 JSONCoder 的配置项请看 JSONCoderOption 

测试示例请看 JSONCoderTest

使用方法

  1. Maven 依赖
    <dependency>
       <groupId>com.ebay.jsoncoder</groupId>
       <artifactId>JSONCoder</artifactId>
       <version>${jsonCoderVersion}</version>
     </dependency>
    You can get current version by searching maven central
  2. 简单的序列化和反序列化
    // serialization
      JSONCoder.global.encode(o)
      // de-serialization
      SomeClass obj = JSONCoder.global.decode(str, SomeClass.class);
  3. 字段和类的过滤
    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);
  4. 泛型的反序列化
    String str = "['str1', 'str2', 'str3']";
    List<String> result = JSONCoder.global.decode(new DecodeReq<List<String>>(){}.setSource(str));
  5. 反序列并合并到已有对象(增量解码)
    TestBean bean = JSONCoder.global.decodeTo(jsonStr, bean);
  6. 设置自定义的引号和自定义的缩进
    JSONCoderOption opt = new JSONCoderOption();
    opt.getJsonOption().setQuoteChar('`');
    opt.getJsonOption().setIndentFactor(2);
    String jsonStr = JSONCoder.global.encode(someObj, opt);
  7. 注册自定义的编码器
    public class CoderBigInteger implements ICoder<BigInteger>{
      public Class<BigInteger> 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);
 相关资料
  • 在上一章,已经讲过在 codec 中使用 JSON 编码。但是,有些日志可能是一种复合的数据结构,其中只是一部分记录是 JSON 格式的。这时候,我们依然需要在 filter 阶段,单独启用 JSON 解码插件。 配置示例 filter { json { source => "message" target => "jsoncontent" } }

  • 问题内容: 有谁知道一个可以轻松地将Java Maps编码为JSON对象的Java库? 更新 由于无法解释的原因(有时我讨厌),我无法在环境中使用泛型。 我正在尝试做的事情是这样的: 并能够再次将其作为地图列表 问题答案: JSON-Simple看起来相对易于使用(下面的示例)。 映射到JSON: JSON到列表/地图:

  • 这可能很容易,但我真的可以在这里使用Ajax和JSON方面更聪明的人来帮助我。我有一个Javascript函数将Ajax请求传递给PHP后端。我将传递一个javascript对象作为“request\u parameters”post变量。当它出现在PHP上时,我可以导航它,但是对象结构已经被数组所取代。相反,我希望对象结构保持完整,因此作为足够聪明的危险类型,我决定对对象进行JSON编码: 相对

  • 问题内容: 我有一个用于ERP系统的快速开发工具,该工具仅允许使用vbscript。我正在尝试使用VBS创建一个简单的AJAX请求。可以使用“ Microsoft.XMLHTTP”对象。 下一步是使用json从网络服务器接收数据。但是在VBS中似乎没有像“ json_decode”或其他功能。 有人知道解决方案吗?还是开发自己的json函数的唯一选择? 问题答案: 由于JSON是一种分层数据格式,

  • 问题内容: 大家好,我是从外部Api获取websocket信息的,它以这种方式给了我json响应: 我把它放在这个结构中 并用代码解码 我遇到错误 我知道该错误是文本字段值的结果。有什么好的方法可以清理它或告诉解码器忽略文本字段的内容吗? 问题答案: 该应用程序正在解析包含substring的数据。这是无效的JSON。错误消息抱怨in 。 由于JSON值包含编码的JSON值,因此应用程序必须分两个

  • 本文向大家介绍Go JSON编码与解码的实现,包括了Go JSON编码与解码的实现的使用技巧和注意事项,需要的朋友参考一下 在开发应用程序时,客户端(前端页面或APP)与服务端交互是在所难免的,在交互过程传递数据时,最通用和流行格式便是JSON,Go语言提供了encoding/json包,用于处理JSON数据的编码与解码。 除了JSON,XML也常用于前后端的数据交互,不过由于简洁性、可读性和流行

  • 我已经下载了json和我的对话档案。我坚持使用奇怪的编码。 json的例子: 应该是这样的: 我正试图这样反序列化它: 不幸的是,输出如下: 有人知道Facebook如何编码json吗?我尝试了几种方法,但没有结果。 谢谢你的帮助。

  • 问题内容: 我有一些json,我需要解码,更改然后编码,而不会弄乱任何字符。 如果我在json字符串中包含unicode字符,它将无法解码。我不知道为什么,因为json.org说一个字符串可以包含:。但这在python中也不起作用。 我可以使用utf8_encode,该字符串将允许使用json_decode对字符串进行解码,但是字符会被压缩成其他形式。这是来自结果数组的print_r的结果。两个字