如何将SQS消费后Jolt转换的JSON中十六进制值转为十进制并更新
问题描述
从SQS队列消费数据后得到JSON输出,未进行存储,通过以下Java代码使用Jolt转换数据:
private Object toTransform(String message) { Object data = null; Object joltConverted; String spec = `spec string`; JoltTransformation joltTransformation; try { data = DATA_READER.readValue(message); joltTransformation=new JoltTransformation(data, spec); joltConverted=joltTransformation.joltConvert(); } catch (Exception e) { LOGGER.error("Error decoding message", e); throw new RuntimeException(e); } return joltConverted; }
转换后得到的JSON格式如下:
[ { "device_0":"04BC", "device_1":"02BA" }, { "device_2":"09AB", "device_3":"04BA" } ]
需要将上述JSON中的十六进制值转换为十进制值并更新该JSON对象。
解决方案
最直接的方式是在Jolt转换完成后,遍历JSON结构将十六进制字符串转换为十进制数值,修改后的代码如下:
private Object toTransform(String message) { Object data = null; Object joltConverted; String spec = `spec string`; JoltTransformation joltTransformation; try { data = DATA_READER.readValue(message); joltTransformation = new JoltTransformation(data, spec); joltConverted = joltTransformation.joltConvert(); // 处理十六进制转十进制逻辑 if (joltConverted instanceof List) { List<?> deviceList = (List<?>) joltConverted; for (Object item : deviceList) { if (item instanceof Map) { Map<String, Object> deviceMap = (Map<String, Object>) item; deviceMap.replaceAll((key, value) -> { if (value instanceof String) { try { // 以16进制解析字符串,返回十进制整数 return Integer.parseInt((String) value, 16); } catch (NumberFormatException e) { // 转换失败时保留原值并打印警告 LOGGER.warn("无法将十六进制字符串 {} 转换为十进制", value); return value; } } return value; }); } } } } catch (Exception e) { LOGGER.error("解析消息出错", e); throw new RuntimeException(e); } return joltConverted; }
代码说明
- 首先判断Jolt转换后的结果是否为
List类型(对应目标JSON的数组结构) - 遍历数组中的每个元素,判断是否为
Map类型(对应数组内的设备对象) - 使用
Map.replaceAll遍历所有键值对,对字符串类型的十六进制值调用Integer.parseInt(value, 16)转换为十进制整数 - 捕获
NumberFormatException处理转换失败的情况,避免程序崩溃,同时保留原始值
内容的提问来源于stack exchange,提问作者nimrekha weerasinghe
相关产品推荐
相关产品推荐

