You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:50:25