https://github.com/ngs-doo/dsl-json
https://github.com/emilsjolander/goson
dsl库
具有高级编译时间数据绑定支持的最快 JVM (Java/Android/Scala/Kotlin) 库。 DSL平台兼容。
为性能设计的Java JSON库。 使用DSL平台编译器构建侵入性软件组合。
特性
支持外部模式- 域规范语言( DSL )
通过注释处理器对现有POJO类进行处理
性能- 比任何其他 Java JSON库都快。 带最快二进制JVM编解码器的对
在字节级别工作- 反序列化可以在字节 [] 或者InputStream上工作。 它不需要中间字符表示
可以扩展性- 可以为序列化/反序列化注册自定义类型
流支持- 大型JSON列表支持使用最小内存使用流
零复制操作- 转换器避免产生垃圾
最小大小- 运行时依赖权大约 150 KB
不安全的代码- 库不依赖于Java不安全/内部方法
遗留 NAME 映射- 可以使用alternativeNames注释将多个JSON属性名的多个版本映射到一个POJO中
绑定到现有实例- 反序列化现有实例时可以提供一个现有实例以减少 GC
高级注释处理器支持- 只支持Java编译或者通过将Java代码转换为DSL模式的DSL平台集成
可以自定义运行时开销- 在反射模式下工作,在Java8注释处理器模式或者DSL平台模式下工作。 编译时准备基于模式和注释的pojo
支持其他库注释- Jackson注释将被使用,编译时分析可以多种方式扩展
Scala 类型支持- Scala 集合,基元和框式基元工作,无需额外的注释或者配置
Kotlin支持- 可以从Kotlin中使用注释处理器。 支持非空注释
基于的基于模式的序列化
DSL可以用于定义用于构造具有嵌入JSON转换的POJO类的架构。 对于在Java类之外定义模型的大型多语言项目来说,这很有用。 关于DSL的更多信息可以在 DSL平台的网站上找到。
@CompiledJson 注释
注释处理器通过分析Java类来工作,它是显式的或者隐式的引用。 编译时处理器输出编码/解码代码/描述。 这样可以避免反射,提供编译时安全性,并允许一些高级配置。 处理器将 register 优化的转换器转换为 META-INF/services。 这将在 DslJson 初始化时加载 ServiceLoader。 即使对于没有 @CompiledJson 注释的依赖对象,也将创建转换器。 这可以用于在不进行注释的前提下为现有类创建序列化程序。
Java8注释处理器
因为 v1.7.0 dsl json支持编译时数据绑定而不支持 Mono/.NET 依赖。 通过对 DslJson api进行更多开销,它还提供了更大的灵活性。 由于集成了运行时分析和各种通用分析的结合,所以它提供了大多数特性和灵活性。 支持Bean属性。public 字段和没有空构造函数的类。
要使用Java8注释处理器,只需引用库的Java8版本即可:
基于的DSL平台注释处理器
DSL平台注释处理器需要. NET/Mono 来创建数据绑定。 它通过将Java代码转换成等价的DSL模式并在它的上运行DSL平台编译器来工作。 生成的代码将避免按照支持out-of-the-box的更小类型的成本来避免拳击/反射问题。 它提供了大多数性能,但功能和灵活性稍少。 Bean属性。public 非final字段和仅包含空构造函数的类
其他集合/容器
Java8支持各种集合,甚至映射和Java8特定容器,如可选。
编译时数据绑定中的自定义类型
没有内置映射的类型可以通过以下三种方式得到支持:
通过实现 JsonObject 和适当的JSON_READER
通过定义自定义转换类并用 @JsonConverter 注释它
通过定义自定义转换类并通过 @JsonAttribute 通过引用它
可以在示例项目中找到自定义转换器。注释处理程序将检查自定义类型实现是否具有适当的签名。 可以在中找到 java.util.ArrayList的转换器示例项目。
实现 Configuration的@JsonConverter 也将在 META-INF/services 中注册,这样就可以方便地设置初始化。
上面的自定义类型示例在Java8版本的库中运行 out-of-the-box。
@JsonAttribute 特性
dsl json属性注释支持多个自定义/特性:
名称- 定义自定义序列化名称
alternativeNames - 不同的传入JSON属性可以映射到适当的属性。 这可以用于简单的特性,例如外壳或者复杂特性,例如模型演化
忽略- 不要将特定属性序列化为 JSON
nullable - 告诉编译器这里属性不能为空。 编译器可以在这种情况下移除一些检查,以提高性能
强制- 必须在JSON中存在强制属性。 即使在省略默认模式下,如果未找到属性,IOException 也将被丢弃
索引- 定义序列化期间使用的索引顺序或者可以用于 array 格式
hashMatch - 使用哈希值的dsl json MATCHES 属性。 在关闭这里选项时,将执行将添加少量反序列化开销的精确比较,但无效的具有相同哈希名称的属性不会被反序列化为”错误”属性。 如果模型包含多个具有相同哈希值的属性,则无论这里选项值如何,编译器都会在默认情况下插入精确比较。
转换器- 每个属性的自定义转换。 可以用于格式化或者任何其他用于特定属性的JSON处理的自定义处理
typeSignature - 在抽象类型序列化期间禁止包含 $type。 默认情况下,抽象类型将包括正确反序列化所需的附加信息。 抽象类型可以通过在 @CompiledJson 上定义 deserializeAs 来反序列化成具体类型,这允许在序列化和反序列化期间删除 $type
外部注释
对于无法使用 @JsonAttribute 替代外部注释修改的现有类,支持:
Nullability注释
在从Java对象转换为DSL模式时,现有的类型系统的可以。 有了非空注释的帮助,可以引入提示来解决一些Java空性类型系统限制。 支持非空注释的List 可以在处理器源代码中找到。
属性别名
注释处理器支持在JSON中自定义属性 NAME的外部注释:
com.fasterxml.jackson.annotation.JsonProperty
com.google.gson.annotations.SerializedName
这些注释将被转换为专用 DSL,用于指定序列化名称。
忽略属性
可以使用支持的注释之一忽略现有的bean属性和字段:
com.fasterxml.jackson.annotation.JsonIgnore
org.codehaus.jackson.annotate.JsonIgnore
忽略的属性将不会转换为DSL模式。
必需的属性
如果JSON中缺少属性,Jackson required = true 可以用于失败:
序列化模式
库具有多种序列化模式:
最小序列化- 忽略可以从架构定义中重新构造的默认属性
所有属性序列化- 将序列化架构定义中的所有属性
array 格式- 对象将序列化为不带属性名称的array
可以通过组合最小序列化和缩小属性名称/别名或者 array 格式来获得最佳序列化性能。
基准测试
独立的基准测试可以验证 dsl json库的性能:
序列化器 - 各种JVM编解码器的基准测试。 以最快的二进制编解码器显示 dsl json
Kostya JSON 快速执行 Java JSON库
面向 Java JSON库的 JMH JSON基准测试
参考基准( 由图书馆作者构建):
.NET vs JVM - 各种JSON库的比较
依赖项
核心库( 使用分析处理器) 和DSL平台注释处理器目标 Java6. Java8库包括运行时分析,反射支持,注释处理器和Java8特定类型。 当使用Java8注释处理器时,Mono/.NET 不需要出现在系统上
最佳实践
重用读取器/编写器。
JsonWriter 有两种操作模式:
将整个输出填充到 byte[]
目标输出流和刷新本地 byte[] 到目标输出流
可以通过 reset 方法重用 JsonWriter,该方法将它的绑定到指定的目标。 当直接使用它时,应该总是通过 DslJson 实例上的newWriter 方法创建它。 几个 DslJson 序列化方法将通过线程局部变量重用编写器。 当通过第一种模式使用 JsonWriter 时,结果可以通过 .toStream(OutputStream) 方法复制到流
JsonReader 可以处理 byte[] 或者 InputStream 输入。 可以通过 process 方法重用它。 调用 DslJson deserialize方法时,通常存在两种类型:
使用 byte[] 参数,在这种情况下将创建新的JsonReader,但是应该重新使用最佳性能 byte[]。
没有 byte[] 参数,在这种情况下线程本地读取器将被重用
对于小消息,最好使用 byte[] API。 当直接使用reader时,应该始终通过 DslJson 实例的newReader 方法创建它。
https://github.com/dhotson/JBuilder-php
https://github.com/raymondjavaxx/jsonbuilder
https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/php_json_objects.html
https://github.com/diegoholiveira/jsonlogic
https://dev.to/udomsak/its-possible-to-pare-json-via-dsl-or-dynamic-input-template-in-golang–52h3
https://awesome-go.com/
https://golangvedu.wordpress.com/2017/01/24/using-mysql-and-json-with-golang-small-tutorial/
https://github.com/bdwilliams/go-jsonify
https://github.com/lensesio/json-sql
https://github.com/ngs-doo/dsl-json
https://www.w3.org/2011/07/SPARQL_JSON/
https://blog.hasura.io/why-not-use-a-json-dsl-instead-of-graphql-d29f20cc97d2/