如何编写Jolt Spec将对象转为数组适配Java POJO
问题:将扁平JSON转换为适配Java POJO的数组结构
我有一个JSON输入,希望将其转换为便于存储到Java POJO的JSON结构,数组结构最适合实现该需求。
输入JSON:
{ "rating-1": { "min": 1, "max": 2 }, "rating-2": { "min": 3 } }
期望转换后的JSON:
{ "Ratings" : [ { "rating": "rating-1", "min": 1, "max": 2 }, { "rating": "rating-2", "min" : 3 } ] }
我尝试了以下Jolt Spec(注意rating-*内部分元素可能为空或null):
[ { "operation": "shift", "spec": { "rating-*": { "$": "Ratings[#0].&1.rating", "min": "Ratings[#0].&1.min", "max": "Ratings[#0].&1.max" } } } ]
得到的输出JSON如下:
{ "Ratings" : [ { "rating-1": { "rating": "rating-1", "min": 1, "max": 2 }, { "rating": "rating-2", "min": 3 } } ] }
问题是该输出生成了多余的"rating-1"/"rating-2"键,不利于创建对应的Java对象,请问需要编写什么样的Jolt Spec才能得到期望的输出?
解决方案
调整Jolt的shift操作,移除多余的层级映射,直接将字段放到数组元素的平级结构中即可:
正确的Jolt Spec:
[ { "operation": "shift", "spec": { "rating-*": { "$": "Ratings[#2].rating", "min": "Ratings[#2].min", "max": "Ratings[#2].max" } } } ]
关键说明:
#2用于获取当前rating-*键对应的数组索引,确保每个rating-*条目都被映射到Ratings数组的独立元素中$直接取当前的键名(如rating-1)赋值给rating字段,避免通过&1保留原层级min和max直接映射到数组元素的同层级字段,完全消除多余的嵌套键
这个Spec会生成你期望的扁平化数组结构,完美适配Java POJO的定义(比如一个包含rating、min、max字段的Rating类,再用List<Rating>组成Ratings属性)。
内容的提问来源于stack exchange,提问作者Suvid Sahay
相关产品推荐
相关产品推荐

