如何使用Jolt将指定JSON输入转换为符合要求的目标输出?
问题描述
需要通过Jolt工具完成JSON格式转换:将输入中lineItems数组内每个对象的attributes字段从JSON字符串转换为JSON对象,但需注意,attributes中的嵌套属性(如attr11)的value需保持字符串格式,不进行JSON转换。
输入示例(Input.json)
{ "id": 67046492, "owner": "John Doe", "version": 1, "lineItems": [ { "id": 219, "attributes": "{}" }, { "id": 220, "attributes": "{\"attr1\":{\"value\":\"7.0\",\"actionCode\":\"ADD\"},\"attr2\":{\"value\":\"gdajdas\",\"actionCode\":\"ADD\"},\"attr3\":{\"value\":\"Y\",\"actionCode\":\"ADD\"},\"attr4\":{\"actionCode\":\"ADD\"},\"attr5\":{\"value\":\"2\",\"actionCode\":\"ADD\"},\"attr6\":{\"value\":\"jjj\",\"actionCode\":\"ADD\"},\"attr7\":{\"value\":\"N\",\"actionCode\":\"ADD\"},\"attr8\":{\"value\":\"jwidhf\",\"actionCode\":\"ADD\"},\"attr9\":{\"value\":\"kncskc\",\"actionCode\":\"ADD\"},\"attr10\":{\"value\":\"2\",\"actionCode\":\"ADD\"},\"attr11\":{\"value\":\"{\\\"key1\\\":\\\"2\\\",\\\"key2\\\":\\\"7.0\\\",\\\"key3\\\":\\\"3.5\\\",\\\"key4\\\":\\\"\\\"}\"},\"actionCode\":\"ADD\"},\"attr12\":{\"value\":\"3.5\",\"actionCode\":\"ADD\"}}" }, { "id": 221, "attributes": "{\"attr1\":{\"value\":\"7.0\",\"actionCode\":\"ADD\"},\"attr2\":{\"value\":\"gdajdas\",\"actionCode\":\"ADD\"},\"attr3\":{\"value\":\"Y\",\"actionCode\":\"ADD\"},\"attr4\":{\"actionCode\":\"ADD\"},\"attr5\":{\"value\":\"2\",\"actionCode\":\"ADD\"},\"attr6\":{\"value\":\"jjj\",\"actionCode\":\"ADD\"},\"attr7\":{\"value\":\"N\",\"actionCode\":\"ADD\"},\"attr8\":{\"value\":\"jwidhf\",\"actionCode\":\"ADD\"},\"attr9\":{\"value\":\"kncskc\",\"actionCode\":\"ADD\"},\"attr10\":{\"value\":\"2\",\"actionCode\":\"ADD\"},\"attr11\":{\"value\":\"{\\\"key1\\\":\\\"2\\\",\\\"key2\\\":\\\"7.0\\\",\\\"key3\\\":\\\"3.5\\\",\\\"key4\\\":\\\"\\\"}\"},\"actionCode\":\"ADD\"},\"attr12\":{\"value\":\"3.5\",\"actionCode\":\"ADD\"}}" } ] }
预期输出示例(Expected.json)
{ "id": 67046492, "owner": "John Doe", "version": 1, "lineItems": [ { "id": 219, "attributes": "{}" }, { "id": 220, "attributes": { "attr1": { "value": "7.0", "actionCode": "ADD" }, "attr2": { "value": "gdajdas", "actionCode": "ADD" }, "attr3": { "value": "Y", "actionCode": "ADD" }, "attr4": { "actionCode": "ADD" }, "attr5": { "value": "2", "actionCode": "ADD" }, "attr6": { "value": "jjj", "actionCode": "ADD" }, "attr7": { "value": "N", "actionCode": "ADD" }, "attr8": { "value": "jwidhf", "actionCode": "ADD" }, "attr9": { "value": "kncskc", "actionCode": "ADD" }, "attr10": { "value": "2", "actionCode": "ADD" }, "attr11": { "value": "{\"key1\":\"2\",\"key2\":\"7.0\",\"key3\":\"3.5\",\"key4\":\"\"}", "actionCode": "ADD" }, "attr12": { "value": "3.5", "actionCode": "ADD" } } }, { "id": 221, "attributes": { "attr1": { "value": "7.0", "actionCode": "ADD" }, "attr2": { "value": "gdajdas", "actionCode": "ADD" }, "attr3": { "value": "Y", "actionCode": "ADD" }, "attr4": { "actionCode": "ADD" }, "attr5": { "value": "2", "actionCode": "ADD" }, "attr6": { "value": "jjj", "actionCode": "ADD" }, "attr7": { "value": "N", "actionCode": "ADD" }, "attr8": { "value": "jwidhf", "actionCode": "ADD" }, "attr9": { "value": "kncskc", "actionCode": "ADD" }, "attr10": { "value": "2", "actionCode": "ADD" }, "attr11": { "value": "{\"key1\":\"2\",\"key2\":\"7.0\",\"key3\":\"3.5\",\"key4\":\"\"}", "actionCode": "ADD" }, "attr12": { "value": "3.5", "actionCode": "ADD" } } } ] }
Jolt转换规则
以下是实现需求的Jolt规范:
[ { "operation": "modify-overwrite-beta", "spec": { "lineItems": { "*": { "attributes": ["=notNull", "=jsonPath(@)", "{}"] } } } }, { "operation": "modify-overwrite-beta", "spec": { "lineItems": { "*": { "attributes": { "*": { "value": ["=notNull", "@"] } } } } } } ]
规则说明
- 第一个
modify-overwrite-beta操作:遍历lineItems数组的每个元素,将非空的attributes字符串解析为JSON对象;若attributes为"{}"则保持原字符串不变。 - 第二个
modify-overwrite-beta操作:遍历解析后的attributes内的所有属性,确保其value字段保留原始字符串格式,不会被二次解析。
内容的提问来源于Stack Exchange,提问作者Rakesh GR
相关产品推荐
相关产品推荐

