For the English version, please click English document.
Jolt是用Java编写的JSON到JSON转换库,可以将我们输入的一个json,转换成目标json.
jolt官网地址传送门 bazaarvoice/jolt.
本项目会持续更新,为大家带来更全、更好的jolt用法教程,如果大家有什么疑问,或者有什么需要转换json,可以在issues 中注明 input(输入),和Output(输出),
大家可以一起探讨交流。
文中如有描述错误,请及时留言指出。如有转载,请标明出处。
在线调试工具 传送门地址. 你可以将json数据和jolt表达式在上面运行,由于这个在线工具是托管在 Google App Engine 上面的,国内的网络可能无法访问
入门教程传送门 gettingStarted.
shift : 将输入json复制到输出json
default : 为输出的json树中增加默认值
remove : 从json树中去除指定的key
sort : 按字母顺序排序映射键值
cardinality : 修正输入数据的基数。urls元素通常是一个List,但是如果只有一个,那么它就是一个字符串
modify-overwrite-beta:总是写
modify-default-beta:当键值对应的值是null时写入
modify-define-beta:当键值不存在时写入
自定义Java类全路径名称:实现Transform或ContextualTransform接口,可选择SpecDriven接口
上面的模式是可以互相结合使用的,下文会详细讲解
以上的说明借鉴了"Panda诚博客" 博客的内容,下面有给出博主的博客地址
上面的前5种类型都只对json的结构进行转换,如果需要对数据进行操作则需要用到modify等相关操作
这里也给大家推荐一下,同样分享jolt的博主 Panda诚博客 传送门.
下面我会给大家详细说明以上不同模式的用法和一些样例。
shift模式的详细例子 shift explain.
default 模式的详细例子 default explain.
remove 模式的详细例子 remove explain.
cardinality 模式的详细例子 cardinality explain.
modify 模式的详细例子modify explain.
不同模式结合使用的案例combine explain.
我们需要自定义一个JoltCustomizedModifier类,此类要实现 SpecDriven和 ContextualTransform 接口,在JoltCustomizedModifier类中存在一个Map,用于存储我们自定义的代码, 这里我们还需要创建一个JoltCustomizedFunction类,它的内部类用于编写我们的自定义方法。
下面是我为jolt官网一个开发者解决的转换问题的自定义的实现类,这个问题的地址 Self containing object - Recursively replace a field name。他需要一个能够递归替换key的方法。
这是我为他创建的自定义实现类JoltCustomizedModifier和JoltCustomizedFunction
这里是测试的demo CustomizedTest
要使用自定义jolt 实现类,只需要将‘operation’ 改成你 JoltCustomizedModifier 类的路径即可
input:
{
"type": "Condition.Aggregate.AND",
"payload": {
"conditionPredicates": [
{
"type": "Condition.Apple",
"payload": {
"fruit": "apple"
}
},
{
"type": "Condition.Aggregate.AND",
"payload": {
"conditionPredicates": [
{
"type": "Condition.Orange",
"payload": {
"fruit": "orange"
}
}
]
}
}
]
}
}
spec:
[
{
"operation": "com.example.oxy.jolt.JoltCustomizedModifier$Overwrite",
"spec": {
"temp": "=recursiveReplacement(@1,'payload.conditionPredicates','conditions')"
}
},
{
"operation": "shift",
"spec": {
"temp": {
"*": "&"
}
}
}
]
output:
{
"type": "Condition.Aggregate.AND",
"payload": {
"conditions": [
{
"type": "Condition.Apple",
"payload": {
"fruit": "apple"
}
},
{
"type": "Condition.Aggregate.AND",
"payload": {
"conditions": [
{
"type": "Condition.Orange",
"payload": {
"fruit": "orange"
}
}
]
}
}
]
}
}