将报文传送过来的String数据转为list

本文探讨了如何使用JSONArray在Java中将JSON数据解析为List类型,具体涉及将JSON对象的data字段转换为TestQueryDto类实例的过程。

json的data是T类型

List list;
list = JSONArray.parseArray((String) json.getData(), TestQueryDto.class);

@Transactional(rollbackFor = Exception.class) public void syncDeviceInfo(Integer deviceId, Integer status) { // 获取设备信息 DeviceInfo deviceInfo = deviceInfoRepository.findById(deviceId) .orElseThrow(() -> new RuntimeException("设备信息不存在")); // 合法性校验 if (status.equals(DeviceInfo.STATUS_ONLINE) && !deviceInfo.getStatus().equals(DeviceInfo.STATUS_OFFLINE)) { throw new RuntimeException("设备必须处于下线状态才能上线"); } try { // 获取关联的模板信息 DeviceModelTemplatePO template = null; if (deviceInfo.getModelTemplateId() != null) { template = deviceModelTemplateRepository.findById(deviceInfo.getModelTemplateId()) .orElseThrow(() -> new RuntimeException("设备模板信息不存在")); } // 获取关联的镜像信息 ImageInfoPO imageInfo = null; if (deviceInfo.getImageInfoId() != null) { imageInfo = imageInfoRepository.findById(deviceInfo.getImageInfoId()) .orElseThrow(() -> new RuntimeException("镜像信息不存在")); } // 调用模板同步接口 if (template != null) { syncDeviceModelTemplate(template, status); } // 调用镜像同步接口 if (imageInfo != null) { syncImageInfo(imageInfo, status); } // 更新设备状态 deviceInfo.setStatus(status); deviceInfoRepository.save(deviceInfo); } catch (Exception e) { throw new RuntimeException("设备信息同步失败: " + e.getMessage(), e); } } /** * 同步设备模板信息到远程服务 * @param template 设备模板 * @param status 状态 */ private void syncDeviceModelTemplate(DeviceModelTemplatePO template, Integer status) { try { RestTemplate restTemplate = new RestTemplate(); ObjectMapper objectMapper = new ObjectMapper(); // Step 1: 构建 inner data -> {"deviceModelTemplates": [...]} Map<String, Object> templateData = objectMapper.convertValue(template, Map.class); // 修复 notSupportControllerVersion 类型(如果它是字符串) Object versionObj = templateData.get("notSupportControllerVersion"); if (versionObj instanceof String str && !str.trim().isEmpty()) { try { List<String> versions = objectMapper.readValue(str, List.class); templateData.put("notSupportControllerVersion", versions); } catch (Exception e) { templateData.put("notSupportControllerVersion", List.of()); } } // 添加 status templateData.put("status", status); // 构造内层对象 Map<String, Object> innerBody = new HashMap<>(); innerBody.put("deviceModelTemplates", List.of(templateData)); // Step 2: 将 innerBody 序列化为字符串(保留转义) String innerJsonString = objectMapper.writeValueAsString(innerBody); // 得到 '{"deviceModelTemplates":[...]}' 字符串 // Step 3: 构造外层:{ "deviceModelTemplate": "..." } 注意 value 是字符串! Map<String, String> outerBody = new HashMap<>(); outerBody.put("deviceModelTemplate", innerJsonString); // 这里是字符串嵌套! // Step 4: 最终要发送的 JSON String finalJson = objectMapper.writeValueAsString(outerBody); // Debug 输出(可选) System.out.println("Final Request Body: " + finalJson); // 设置头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<>(finalJson, headers); String url = "http://localhost:9090/actuator/deviceModelTemplate"; ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class); if (!response.getStatusCode().is2xxSuccessful()) { throw new RuntimeException("设备模板同步失败,HTTP状态码: " + response.getStatusCode() + ", 响应: " + response.getBody()); } } catch (Exception e) { throw new RuntimeException("设备模板同步异常: " + e.getMessage(), e); } } 我现在需要将DeviceModelTemplatePO转为DeviceModelTemplateActuateVO再传输,VO的定义如下: /* * Copyright (c) 2024, TP-Link Corporation Limited. All rights reserved. */ package me.zhengjie.gen.domain.vo; import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; /** * @author Zhou Zhuoran * @version 1.0 * @since 2024/12/9 */ @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class DeviceModelTemplateActuateVO { /** * 设备model,如ER605 */ @JsonProperty("model") private String model; /** * 组件协商文中的hwVersion */ @JsonProperty("hw_version") private String hwVersion; /** * 组件协商文header里的version */ @JsonProperty("version") private String version; /** * 设备类型 */ @JsonProperty("type") private String type; /** * 发布新机的数据版本号 */ @JsonProperty("controller_version") private String controllerVersion; /** * 发布新机最小支持的版本号 */ @JsonProperty("min_controller_version") private String minControllerVersion; /** * 发布新机的数据版本号 */ @JsonProperty("not_support_controller_version") private List<String> notSupportControllerVersion; /** * 是否为ippt模式 */ @JsonProperty("ippt") private Boolean ippt; /** * 设备的分类,Pro/Normal/一体机等 */ @JsonProperty("model_type") private String modelType; /** * 设备版本号,如1.0、2.0、1.20、2.20等 */ @JsonProperty("model_version") private String modelVersion; /** * 组件协商文 */ @JsonProperty("adopt_resp") private String adoptResp; }
最新发布
10-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值