JSONObject.put 覆盖原有数据,解决办法

当使用JSONObject的put方法添加键值对时,相同key的value会被覆盖。通过检查put方法的返回值,可以判断key是否已存在。若返回值为空,则直接添加;若非空,则将新value与旧value合并,避免数据丢失。具体实现示例:在添加键值对前检查返回值,若key已存在,则将新value与旧value用逗号连接,更新json对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产中遇到jsonobject的添加,但是会遇到许多的相同的key值,如果put的话就会覆盖之前的value。‘
上原网址看有配图
http://www.jianshu.com/p/924d92cf5eed
在许多的解决方法中大多数人是在for循环里写了JSONObject newjson = new JSONObject();

这么一句,但是我要这种形式的怎么办? {“王焕”:”经理,执行董事”}是不是不能这么写了,如果这样写得到的是什么呢?控制台输出如下:

{“王焕”:”经理”} {“王焕”:”执行董事”}

经过三个小时的研究我发现,如果你new一个和之前相同的key的话他会返回之前的value,如果之前没有的话就会返回空。如下图:
JSONObject newjson = new JSONObject();
newjson.put(“李白”,”诗人”);
newjson.put(“王维”, “诗人”);
newjson.put(“李白”, “剑客”);
Object xx = newjson.put(“韩愈”, “教育家”);
Object xx1 = newjson.put(“王维”, “山西人”);
System.out.println(xx);
System.out.println(xx1);
——————————————————————————————————
null
诗人

不知道你们看懂没?王维是之前出现过的key值,再一次put就会返回之前的value值,韩愈之前没有,所以返回null。这是发现很有帮助,思维如下

借用返回值是否为空做一个判断,如果返回值为空,那就不管他,添加就好,如果返回值不是空说明这个key之前已经添加过,再次添加则会覆盖掉返回值,那怎么办,不为空put的时候把返回值拼接。这里我没有if判断。如图:

JSONObject newjson = new JSONObject();
newjson.put(“李白”,”诗人”);
newjson.put(“王维”, “诗人”);
newjson.put(“李白”, “剑客”);
Object xx = newjson.put(“韩愈”, “教育家”);
Object xx1 = newjson.put(“王维”, “山西人”);
newjson.put(“王维”, “山西人”+”,”+xx1);
System.out.println(newjson.toJSONString());
System.out.println(xx);
System.out.println(xx1);
——————————————————————————
{“李白”:”剑客”,”王维”:”山西人,诗人”,”韩愈”:”教育家”}
null
诗人

这样就达到目的了。生产的源码就不粘了,道理是一样的不过生产中还有其他的业务逻辑。

JSONObject map2 = jsonObject.getJSONObject(“map”); // 提取 x 轴数据 List xList2 = map2.getJSONArray(“x”).toJavaList(String.class); // 提取 y 数据 JSONArray yArray = map2.getJSONArray(“y”); // 按年份分组数据 Map<String, Map<String, Map<String, Double>>> yearDataMap = new LinkedHashMap<>(); for (Object obj : yArray) { JSONObject yItem = (JSONObject) obj; String name = yItem.getString(“name”); String[] parts = name.split(“😊; if (parts.length < 2) continue; String yearMonth = parts[0]; String metric = parts[1]; String year = yearMonth.substring(0, 4); // 提取年份 if (metric.equals(“CUR_REAL_ANP_ADJ”)) continue; List ratios = yItem.getJSONArray(“ratio”).toJavaList(String.class); // 初始化年份数据结构 yearDataMap.putIfAbsent(year, new LinkedHashMap<>()); for (int i = 0; i < xList2.size(); i++) { String xValue = xList2.get(i); if (xValue.equals(“空”) || xValue.equals(”-99") || xValue.equals(“-100”) || xValue.equals(“没开启”)) { continue; } String dimValue = xValue + prefix; String valueStr = ratios.get(i); // 初始化维度值数据结构 yearDataMap.get(year).putIfAbsent(dimValue, new LinkedHashMap<>()); // 转换并存储值 try { double value = Double.parseDouble(valueStr); yearDataMap.get(year).get(dimValue).put(metric, value); } catch (NumberFormatException e) { // 处理转换错误 yearDataMap.get(year).get(dimValue).put(metric, 0.0); } } } // 构建结果 JSONObject result2 = new JSONObject(); result2.put(“dimName”, jsonObject.getString(“dimName”)); result2.put(“title”, jsonObject.getString(“title”)); JSONArray dataArray2 = new JSONArray(); // 处理每个年份的数据 for (Map.Entry<String, Map<String, Map<String, Double>>> yearEntry : yearDataMap.entrySet()) { JSONObject yearObj = new JSONObject(); yearObj.put(“year”, yearEntry.getKey()); JSONArray objArray = new JSONArray(); for (Map.Entry<String, Map<String, Double>> dimEntry : yearEntry.getValue().entrySet()) { JSONObject dimObj = new JSONObject(); dimObj.put(“dimValue”, dimEntry.getKey()); // 添加所有指标值 for (Map.Entry<String, Double> metricEntry : dimEntry.getValue().entrySet()) { dimObj.put(metricEntry.getKey(), metricEntry.getValue()); } objArray.add(dimObj); } yearObj.put(“obj”, objArray); dataArray2.add(yearObj); } result2.put(“data”, dataArray2); // 构建请求参数 paramObj = buildRequestParams(Collections.singletonMap(“question”, result2.toString())); break; 在这段代码的基础上,把数据结构变为下面这种 { “dimName”:“车龄”,“title”:“提升效果”,“data”:[ { “year”:“2024”,“obj”:[ {“dimValue”:“新车车龄”,list[0.676,0.6832,0.0688]},{“dimValue”:“(0.75,1]车龄”,list:[0.6388,0.6978,0.0342]},{“dimValue”:“(1,2]车龄”,list:[0.6819,0.7279,0.0623]},{“dimValue”:“(2,3]车龄”,list:[0.6593,0.7286,0.0668]},{“dimValue”:“(3,4]车龄”,list:[0.6345,0.7024,0.0766]},{“dimValue”:“(4,5]车龄”,list:[0.7203,0.6853,0.0566]},{“dimValue”:“(5,6]车龄”,list:[0.6357,0.6636,0.0732]},{“dimValue”:“(6,7]车龄”,list:[0.6402,0.6532,0.081]},{“dimValue”:“(7,8]车龄”,list:[0.6382,0.6417,0.0979]},{“dimValue”:“(8,9]车龄”,list:[0.5962,0.6362,0.077]}, {“dimValue”:“(9,10]车龄”,list:[0.6465,0.6335,0.0766]},{“dimValue”:“(10,11]车龄”,list:[0.6215,0.6245,0.0592]},{“dimValue”:“(11,12]车龄”,list:[0.621,0.6197,0.0529]},{“dimValue”:“(12,13]车龄”,list:[0.5749,0.5831,0.0368]},{“dimValue”:“(13,14]车龄”,list:[0.5395,0.5792,0.032]},{“dimValue”:“(14,15]车龄”,list:[0.5657,0.5741,0.0229]},{“dimValue”:“>15车龄”,list:[0.513,0.5442,0.0245]} ] }, { “year”:“2025”,“obj”:[ {“dimValue”:“新车车龄”,list[0.6866,0.6936,0.0757]},{“dimValue”:“(0.75,1]车龄”,list:[0.609,0.6849,0.0499]},{“dimValue”:“(1,2]车龄”,list:[0.5467,0.6885,0.0619]},{“dimValue”:“(2,3]车龄”,list:[0.8135,0.6994,0.0648]},{“dimValue”:“(3,4]车龄”,list:[0.5713,0.6824,0.0693]},{“dimValue”:“(4,5]车龄”,list:[0.5425,0.6673,0.0627]},{“dimValue”:“(5,6]车龄”,list:[0.6058,0.6524,0.0736]},{“dimValue”:“(6,7]车龄”,list:[0.7198,0.6411,0.0742]},{“dimValue”:“(7,8]车龄”,list:[0.6564,0.631,0.0762]},{“dimValue”:“(8,9]车龄”,list:[0.6165,0.6211,0.0796]}, {“dimValue”:“(9,10]车龄”,list:[0.6178,0.6206,0.0713]},{“dimValue”:“(10,11]车龄”,list:[0.6791,0.6058,0.0634]},{“dimValue”:“(11,12]车龄”,list:[0.6719,0.6018,0.0504]},{“dimValue”:“(12,13]车龄”,list:[0.5914,0.5709,0.0411]},{“dimValue”:“(13,14]车龄”,list:[0.409,0.5634,0.0301]},{“dimValue”:“(14,15]车龄”,list:[0.6937,0.5616,0.0233]},{“dimValue”:“>15车龄”,list:[0.4288,0.5368,0.0317]} ] } ] }
07-10
package com.tongchuang.realtime.mds; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.tongchuang.realtime.bean.ULEParamConfig; import com.tongchuang.realtime.util.KafkaUtils; import org.apache.flink.api.common.eventtime.WatermarkStrategy; import org.apache.flink.api.common.state.; import org.apache.flink.api.common.time.Time; import org.apache.flink.api.common.typeinfo.BasicTypeInfo; import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.configuration.Configuration; import org.apache.flink.connector.kafka.source.KafkaSource; import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer; import org.apache.flink.streaming.api.datastream.; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.co.KeyedBroadcastProcessFunction; import org.apache.flink.streaming.api.functions.source.RichSourceFunction; import org.apache.flink.util.Collector; import java.io.Serializable; import java.sql.; import java.text.SimpleDateFormat; import java.util.; import java.util.Date; import java.util.concurrent.TimeUnit; public class ULEDataanomalyanalysis { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // 创建Kafka消费者 KafkaSource<String> kafkaConsumer = KafkaUtils.getKafkaConsumer( "realdata_minute", "minutedata_uledataanomalyanalysis", OffsetsInitializer.latest() ); DataStreamSource<String> kafkaDS = env.fromSource( kafkaConsumer, WatermarkStrategy.noWatermarks(), "realdata_uledataanomalyanalysis" ); // 解析JSON并拆分每个tag的数据 SingleOutputStreamOperator<JSONObject> splitStream = kafkaDS .map(JSON::parseObject) .flatMap((JSONObject value, Collector<JSONObject> out) -> { JSONObject data = value.getJSONObject("datas"); String time = value.getString("times"); for (String tag : data.keySet()) { JSONObject tagData = data.getJSONObject(tag); JSONObject newObj = new JSONObject(); newObj.put("time", time); newObj.put("tag", tag); newObj.put("ontime", tagData.getDouble("ontime")); newObj.put("avg", tagData.getDouble("avg")); out.collect(newObj); } }) .returns(TypeInformation.of(JSONObject.class)) .name("Split-By-Tag"); // 每5分钟加载参数配置 DataStream<ConfigCollection> configDataStream = env .addSource(new MysqlConfigSource()) .setParallelism(1) .filter(Objects::nonNull) .name("Config-Source"); // 将配置流转换为广播流 BroadcastStream<ConfigCollection> configBroadcastStream = configDataStream .broadcast(Descriptors.configStateDescriptor); // 按tag分组并连接广播流 KeyedStream<JSONObject, String> keyedStream = splitStream .keyBy(json -> json.getString("tag")); BroadcastConnectedStream<JSONObject, ConfigCollection> connectedStream = keyedStream.connect(configBroadcastStream); // 异常检测处理 SingleOutputStreamOperator<JSONObject> anomalyStream = connectedStream .process(new OptimizedAnomalyDetectionFunction()) .name("Anomaly-Detection"); anomalyStream.print("异常检测结果"); // anomalyStream.map(JSON::toString).addSink(KafkaUtils.getKafkaSink("minutedata_uleanomaly")); env.execute("uledataanomalyanalysis"); } // 配置集合类 - 修复配置变化检测问题 public static class ConfigCollection implements Serializable { private static final long serialVersionUID = 1L; public final Map<String, List<ULEParamConfig>> tagToConfigs; public final Map<String, ULEParamConfig> encodeToConfig; private final long contentHash; // 添加内容哈希值用于精确检测变化 public ConfigCollection(Map<String, List<ULEParamConfig>> tagToConfigs, Map<String, ULEParamConfig> encodeToConfig) { this.tagToConfigs = new HashMap<>(tagToConfigs); this.encodeToConfig = new HashMap<>(encodeToConfig); // 计算内容哈希值(考虑所有配置项的内容) this.contentHash = calculateContentHash(); } private long calculateContentHash() { long hash = 0L; // 对每个配置项计算哈希(使用所有字段) for (ULEParamConfig config : encodeToConfig.values()) { hash = 31 * hash + Objects.hash( config.tag, config.encode, config.datatype, config.constantvalue, config.isonline, config.issync, config.syncparaencode, config.iszero, config.ishigh, config.highthreshold, config.islow, config.lowthreshold, config.duration ); } return hash; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ConfigCollection that = (ConfigCollection) o; return contentHash == that.contentHash; } @Override public int hashCode() { return (int) (contentHash ^ (contentHash >>> 32)); } public int configCount() { return encodeToConfig.size(); } } // MySQL配置源 - 优化配置加载和变化检测 public static class MysqlConfigSource extends RichSourceFunction<ConfigCollection> { private volatile boolean isRunning = true; private final long interval = TimeUnit.MINUTES.toMillis(5); private transient ConfigCollection lastConfig; private long lastConfigHash = 0; @Override public void run(SourceContext<ConfigCollection> ctx) throws Exception { while (isRunning) { ConfigCollection newConfig = loadParams(); if (newConfig != null) { long newHash = newConfig.contentHash; if (lastConfig == null || newHash != lastConfigHash) { ctx.collect(newConfig); lastConfig = newConfig; lastConfigHash = newHash; System.out.println("检测到配置变化,广播新配置 (哈希值: " + newHash + ")"); } else { System.out.println("配置未变化,跳过广播 (哈希值: " + newHash + ")"); } } else { System.out.println("配置加载失败,使用上次配置"); } Thread.sleep(interval); } } private ConfigCollection loadParams() { Map<String, List<ULEParamConfig>> tagToConfigs = new HashMap<>(5000); Map<String, ULEParamConfig> encodeToConfig = new HashMap<>(5000); String url = "jdbc:mysql://10.51.37.73:3306/eps?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"; String user = "root"; String password = "6CKIm5jDVsLrahSw"; String query = "SELECT F_tag AS tag, F_enCode AS encode, F_dataTypes AS datatype, " + "F_isConstantValue AS constantvalue, F_isOnline AS isonline, " + "F_isSync AS issync, F_syncParaEnCode AS syncparaencode, " + "F_isZero AS iszero, F_isHigh AS ishigh, F_highThreshold AS highthreshold, " + "F_isLow AS islow, F_lowThreshold AS lowthreshold, F_duration AS duration " + "FROM t_equipmentparameter " + "WHERE F_enabledmark = '1' AND (F_isConstantValue ='1' OR F_isZero= '1' " + "OR F_isHigh = '1' OR F_isLow = '1' OR F_isOnline = '1' OR F_isSync = '1')"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query)) { while (rs.next()) { ULEParamConfig config = new ULEParamConfig(); config.tag = rs.getString("tag"); config.encode = rs.getString("encode"); config.datatype = rs.getString("datatype"); config.constantvalue = rs.getInt("constantvalue"); config.iszero = rs.getInt("iszero"); config.ishigh = rs.getInt("ishigh"); config.highthreshold = rs.getDouble("highthreshold"); config.islow = rs.getInt("islow"); config.lowthreshold = rs.getDouble("lowthreshold"); config.duration = rs.getLong("duration"); config.isonline = rs.getInt("isonline"); config.issync = rs.getInt("issync"); config.syncparaencode = rs.getString("syncparaencode"); String tag = config.tag; tagToConfigs.computeIfAbsent(tag, k -> new ArrayList<>(10)).add(config); encodeToConfig.put(config.encode, config); } System.out.println("加载配置: " + encodeToConfig.size() + " 个参数"); return new ConfigCollection(tagToConfigs, encodeToConfig); } catch (SQLException e) { System.err.println("加载参数配置错误:"); e.printStackTrace(); return null; } } @Override public void cancel() { isRunning = false; } } // 状态描述符 public static class Descriptors { public static final MapStateDescriptor<Void, ConfigCollection> configStateDescriptor = new MapStateDescriptor<>( "configState", TypeInformation.of(Void.class), TypeInformation.of(ConfigCollection.class) ); } // 优化后的异常检测函数(带状态TTL和离线检测优化) public static class OptimizedAnomalyDetectionFunction extends KeyedBroadcastProcessFunction<String, JSONObject, ConfigCollection, JSONObject> { // 状态管理 private transient MapState<String, AnomalyState> stateMap; // key=encode private transient MapState<String, Double> lastValuesMap; // key=tag private transient MapState<String, Long> lastDataTimeMap; // key=tag private transient MapState<String, Long> offlineTimerState; // key=encode private transient SimpleDateFormat timeFormat; @Override public void open(Configuration parameters) { // 状态TTL配置(30天自动清理) StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.days(3000)) .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite) .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired) .cleanupFullSnapshot() .build(); // 初始化异常状态存储(启用TTL) MapStateDescriptor<String, AnomalyState> stateDesc = new MapStateDescriptor<>( "anomalyState", BasicTypeInfo.STRING_TYPE_INFO, TypeInformation.of(AnomalyState.class) ); stateDesc.enableTimeToLive(ttlConfig); stateMap = getRuntimeContext().getMapState(stateDesc); // 初始化最新值存储(启用TTL) MapStateDescriptor<String, Double> valuesDesc = new MapStateDescriptor<>( "lastValuesState", BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.DOUBLE_TYPE_INFO ); valuesDesc.enableTimeToLive(ttlConfig); lastValuesMap = getRuntimeContext().getMapState(valuesDesc); // 初始化最后数据时间存储(启用TTL) MapStateDescriptor<String, Long> timeDesc = new MapStateDescriptor<>( "lastDataTimeState", BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.LONG_TYPE_INFO ); timeDesc.enableTimeToLive(ttlConfig); lastDataTimeMap = getRuntimeContext().getMapState(timeDesc); // 初始化离线定时器状态(启用TTL) MapStateDescriptor<String, Long> timerDesc = new MapStateDescriptor<>( "offlineTimerState", BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.LONG_TYPE_INFO ); timerDesc.enableTimeToLive(ttlConfig); offlineTimerState = getRuntimeContext().getMapState(timerDesc); timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); } @Override public void processElement(JSONObject data, ReadOnlyContext ctx, Collector<JSONObject> out) throws Exception { String tag = ctx.getCurrentKey(); String timeStr = data.getString("time"); long eventTime = timeFormat.parse(timeStr).getTime(); // 更新最后数据时间 lastDataTimeMap.put(tag, eventTime); // 获取广播配置 ConfigCollection configCollection = getBroadcastConfig(ctx); if (configCollection == null) { return; } List<ULEParamConfig> configs = configCollection.tagToConfigs.get(tag); if (configs == null || configs.isEmpty()) { return; } // ========== 清理无效状态 ========== Iterator<String> stateKeys = stateMap.keys().iterator(); while (stateKeys.hasNext()) { String encode = stateKeys.next(); boolean found = false; for (ULEParamConfig cfg : configs) { if (cfg.encode.equals(encode)) { found = true; break; } } if (!found) { stateMap.remove(encode); // 清理相关定时器 Long timer = offlineTimerState.get(encode); if (timer != null) { ctx.timerService().deleteEventTimeTimer(timer); offlineTimerState.remove(encode); } } } double value = 0; boolean valueSet = false; // 遍历配置项进行异常检测 for (ULEParamConfig config : configs) { if (!valueSet) { value = "436887485805570949".equals(config.datatype) ? data.getDouble("ontime") : data.getDouble("avg"); lastValuesMap.put(tag, value); valueSet = true; } // 获取或初始化状态 AnomalyState state = getOrCreateState(config.encode); // ========== 离线恢复检测 ========== if (config.isonline == 1) { AnomalyStatus status = state.getStatus(5); if (status.reported) { // 设备重新上线,发送恢复事件 reportAnomaly(5, 0, 0.0, timeStr, config, out); status.reset(); System.out.println("设备 " + tag + " 恢复在线,发送恢复事件"); } } // 处理异常类型 checkConstantValueAnomaly(config, value, timeStr, state, out); checkZeroValueAnomaly(config, value, timeStr, state, out); checkThresholdAnomaly(config, value, timeStr, state, out); checkSyncAnomaly(config, value, timeStr, state, configCollection, out); // 设置离线检测定时器(仅当配置开启离线检测时) if (config.isonline == 1) { setupOfflineTimer(tag, config, eventTime, ctx); } // 保存状态 stateMap.put(config.encode, state); } } // 设置离线检测定时器 private void setupOfflineTimer(String tag, ULEParamConfig config, long eventTime, ReadOnlyContext ctx) throws Exception { long durationMillis = config.duration * 60 * 1000; long timerTimestamp = eventTime + durationMillis; String timerKey = config.encode; // 使用encode作为唯一标识 // 清除旧定时器(如果存在) Long oldTimer = offlineTimerState.get(timerKey); if (oldTimer != null) { ctx.timerService().deleteEventTimeTimer(oldTimer); } // 注册新定时器(事件时间) ctx.timerService().registerEventTimeTimer(timerTimestamp); offlineTimerState.put(timerKey, timerTimestamp); } @Override public void onTimer(long timestamp, OnTimerContext ctx, Collector<JSONObject> out) throws Exception { String tag = ctx.getCurrentKey(); // 获取广播配置 ConfigCollection configCollection = getBroadcastConfig(ctx); if (configCollection == null) return; List<ULEParamConfig> configs = configCollection.tagToConfigs.get(tag); if (configs == null) return; // 找出匹配的定时器 List<ULEParamConfig> triggeredConfigs = new ArrayList<>(); for (ULEParamConfig config : configs) { if (config.isonline == 1) { Long storedTimer = offlineTimerState.get(config.encode); if (storedTimer != null && storedTimer == timestamp) { triggeredConfigs.add(config); } } } // 处理所有触发的配置项 for (ULEParamConfig config : triggeredConfigs) { Long lastEventTime = lastDataTimeMap.get(tag); AnomalyState state = getOrCreateState(config.encode); AnomalyStatus status = state.getStatus(5); // 5=离线类型 if (lastEventTime == null || lastEventTime < timestamp - config.duration * 60 * 1000) { // 触发离线异常 if (!status.reported) { reportAnomaly(5, 1, 0.0, timeFormat.format(new Date(timestamp)), config, out); status.reported = true; System.out.println("设备 " + tag + " 离线报告"); } } else { // 取消误报 if (status.reported) { reportAnomaly(5, 0, 0.0, timeFormat.format(new Date()), config, out); status.reported = false; System.out.println("设备 " + tag + " 离线恢复"); } } // 重置定时器 offlineTimerState.remove(config.encode); } } // 恒值检测 private void checkConstantValueAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, Collector<JSONObject> out) { if (config.constantvalue != 1) return; try { AnomalyStatus status = state.getStatus(1); long durationThreshold = config.duration * 60 * 1000; Date timestamp = timeFormat.parse(timeStr); if (status.lastValue == null) { status.lastValue = currentValue; status.lastChangeTime = timestamp; return; } if (Math.abs(currentValue - status.lastValue) > 0.001) { status.lastValue = currentValue; status.lastChangeTime = timestamp; if (status.reported) { reportAnomaly(1, 0, currentValue, timeStr, config, out); } status.reset(); return; } long elapsed = timestamp.getTime() - status.lastChangeTime.getTime(); if (elapsed > durationThreshold) { if (!status.reported) { reportAnomaly(1, 1, currentValue, timeStr, config, out); status.reported = true; } } } catch (Exception e) { System.err.println("恒值检测错误: " + config.encode + " - " + e.getMessage()); } } // 零值检测 private void checkZeroValueAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, Collector<JSONObject> out) { if (config.iszero != 1) return; try { AnomalyStatus status = state.getStatus(2); Date timestamp = timeFormat.parse(timeStr); boolean isZero = Math.abs(currentValue) < 0.001; if (isZero) { if (status.startTime == null) { status.startTime = timestamp; } else if (!status.reported) { long elapsed = timestamp.getTime() - status.startTime.getTime(); if (elapsed >= config.duration * 60 * 1000) { reportAnomaly(2, 1, currentValue, timeStr, config, out); status.reported = true; } } } else { if (status.reported) { reportAnomaly(2, 0, currentValue, timeStr, config, out); status.reset(); } else if (status.startTime != null) { status.startTime = null; } } } catch (Exception e) { System.err.println("零值检测错误: " + config.encode + " - " + e.getMessage()); } } // 阈值检测 private void checkThresholdAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, Collector<JSONObject> out) { try { if (config.ishigh == 1) { AnomalyStatus highStatus = state.getStatus(3); processThresholdAnomaly(highStatus, currentValue, timeStr, currentValue > config.highthreshold, config, 3, out); } if (config.islow == 1) { AnomalyStatus lowStatus = state.getStatus(4); processThresholdAnomaly(lowStatus, currentValue, timeStr, currentValue < config.lowthreshold, config, 4, out); } } catch (Exception e) { System.err.println("阈值检测错误: " + config.encode + " - " + e.getMessage()); } } private void processThresholdAnomaly(AnomalyStatus status, double currentValue, String timeStr, boolean isAnomaly, ULEParamConfig config, int anomalyType, Collector<JSONObject> out) { try { Date timestamp = timeFormat.parse(timeStr); if (isAnomaly) { if (status.startTime == null) { status.startTime = timestamp; } else if (!status.reported) { long elapsed = timestamp.getTime() - status.startTime.getTime(); if (elapsed >= config.duration * 60 * 1000) { reportAnomaly(anomalyType, 1, currentValue, timeStr, config, out); status.reported = true; } } } else { if (status.reported) { reportAnomaly(anomalyType, 0, currentValue, timeStr, config, out); status.reset(); } else if (status.startTime != null) { status.startTime = null; } } } catch (Exception e) { System.err.println("阈值处理错误: " + config.encode + " - " + e.getMessage()); } } // 同步检测 private void checkSyncAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, ConfigCollection configCollection, Collector<JSONObject> out) { if (config.issync != 1 || config.syncparaencode == null) return; try { AnomalyStatus status = state.getStatus(6); Date timestamp = timeFormat.parse(timeStr); ULEParamConfig relatedConfig = configCollection.encodeToConfig.get(config.syncparaencode); if (relatedConfig == null) return; String relatedTag = null; for (Map.Entry<String, List<ULEParamConfig>> entry : configCollection.tagToConfigs.entrySet()) { if (entry.getValue().contains(relatedConfig)) { relatedTag = entry.getKey(); break; } } if (relatedTag == null) return; Double relatedValue = lastValuesMap.get(relatedTag); if (relatedValue == null) return; boolean isAnomaly = (Math.abs(currentValue - 1.0) < 0.001) && (Math.abs(relatedValue) < 0.001); if (isAnomaly) { if (status.startTime == null) { status.startTime = timestamp; } else if (!status.reported) { long elapsed = timestamp.getTime() - status.startTime.getTime(); if (elapsed >= config.duration * 60 * 1000) { reportAnomaly(6, 1, currentValue, timeStr, config, out); status.reported = true; } } } else { if (status.reported) { reportAnomaly(6, 0, currentValue, timeStr, config, out); status.reset(); } else if (status.startTime != null) { status.startTime = null; } } } catch (Exception e) { System.err.println("同步检测错误: " + config.encode + " - " + e.getMessage()); } } // 报告异常 private void reportAnomaly(int anomalyType, int statusFlag, double value, String time, ULEParamConfig config, Collector<JSONObject> out) { JSONObject event = new JSONObject(); event.put("tag", config.tag); event.put("paracode", config.encode); event.put("abnormaltype", anomalyType); event.put("statusflag", statusFlag); event.put("datavalue", value); event.put("triggertime", time); out.collect(event); } @Override public void processBroadcastElement(ConfigCollection newConfig, Context ctx, Collector<JSONObject> out) { BroadcastState<Void, ConfigCollection> state = ctx.getBroadcastState(Descriptors.configStateDescriptor); try { state.put(null, newConfig); // 仅更新广播状态 } catch (Exception e) { e.printStackTrace(); } System.out.println("广播配置更新完成, 配置项: " + newConfig.configCount()); } // ========== 辅助方法 ========== private ConfigCollection getBroadcastConfig(ReadOnlyContext ctx) throws Exception { return ctx.getBroadcastState(Descriptors.configStateDescriptor).get(null); } private AnomalyState getOrCreateState(String encode) throws Exception { AnomalyState state = stateMap.get(encode); if (state == null) { state = new AnomalyState(); } return state; } } // 异常状态类 public static class AnomalyState implements Serializable { private static final long serialVersionUID = 1L; private final Map<Integer, AnomalyStatus> statusMap = new HashMap<>(); public AnomalyStatus getStatus(int type) { return statusMap.computeIfAbsent(type, k -> new AnomalyStatus()); } } // 异常状态详情 public static class AnomalyStatus implements Serializable { private static final long serialVersionUID = 1L; public Date startTime; // 异常开始时间 public Double lastValue; // 用于恒值检测 public Date lastChangeTime; // 值最后变化时间 public boolean reported; // 是否已报告 public void reset() { startTime = null; lastValue = null; lastChangeTime = null; reported = false; } } }上述代码需完善内容,1、离线监测未实现,当配置中有条的tag更改,且流数据中没有该tag,未报出离线异常;2、当参数调整时,已有的报警状态参数,配置成不启用相应的报警如何处理。生成完整优化代码
最新发布
08-01
// 1.查询上传机构 List<Map<String, Object>> orgList = nationInventoryReadMapper.queryOrgList(fixmedinsCode); // 查询最近时间的上传机构 QueryWrapper<HisInvUploadInfoBDO> query = new QueryWrapper<>(); query.orderByDesc("upload_end_time"); List<HisInvUploadInfoBDO> list = hisInvUploadInfoBService.list(query); String currentFixmedinsCode = null; if(list.size()>0 && list.get(0).getUploadEndTime()!=null) { currentFixmedinsCode = list.get(0).getFixmedinsCode(); } // 继续执行标志,如果上次没有执行完成,继续按上次机构执行 Boolean isContinue = ValidateUtil.isEmpty(currentFixmedinsCode)?true:false; // 2.循环机构信息 for (Map<String, Object> org : orgList) { fixmedinsCode = org.get("o_insurancecode").toString(); if (fixmedinsCode.equals(currentFixmedinsCode)){ isContinue = true; } if(isContinue==false){ continue; } String fixmedinsName = org.get("o_insurancename").toString(); String orgid = org.get("orgid").toString(); String porgid = org.get("porgid").toString(); String fixmedinsSyscode = "04"; String fixmedinsSyscodeName = "新版橘杏"; String infno = ""; // 3501、3502、3503、3504、3505、3506 TODO 3507单独接口处理 String linkInvDetailStartId = ""; String linkInvDetailEndId = ""; Integer uploadSuccessCnt = 0; Integer uploadRemainingCnt = 0; Integer uploadFailCnt = 0; Date uploadStartTime = new Date(); Date uploadEndTime; String linkDb = "clinic"; String linkIdName = "linkId"; // 盘存上传 3501 Integer uploadDtlSuccessCnt = 0; Integer uploadDtlRemainingCnt = 0; Integer uploadDtlFailCnt = 0; String uploadErrMsg = ""; Integer uploadDtlSuccessCntN3502 = 0; Integer uploadDtlRemainingCntN3502 = 0; Integer uploadDtlFailCntN3502 = 0; String uploadErrMsgN3502 = ""; infno = "3501"; String baseId = fixmedinsCode+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String hisInvUploadInfoBId = baseId; query = new QueryWrapper<>(); query.lambda().eq(HisInvUploadInfoBDO::getFixmedinsCode,fixmedinsCode); list = hisInvUploadInfoBService.list(query); Boolean hasInfoBId = false; if(list.size()>0){ HisInvUploadInfoBDO hisInvUploadInfoBDONew = list.get(0); uploadSuccessCnt = hisInvUploadInfoBDONew.getUploadSuccessCnt(); uploadRemainingCnt = hisInvUploadInfoBDONew.getUploadRemainingCnt(); uploadFailCnt = hisInvUploadInfoBDONew.getUploadFailCnt(); hasInfoBId = true; hisInvUploadInfoBId = hisInvUploadInfoBDONew.getHisInvUploadInfoBId(); } String hisInvUploadDetailBId = baseId+infno; String hisInvUploadDetailBIdN3502 = baseId+"3502"; // 检查当前机构是否需要盘存 QueryWrapper<HisInvUploadDetailBDO> queryDetail = new QueryWrapper<>(); queryDetail.lambda().eq(HisInvUploadDetailBDO::getInfno,"3501"); List<HisInvUploadDetailBDO> checkList = hisInvUploadDetailBService.list(queryDetail); if(checkList.size()==0){ List<Map<String,Object>> n3501List = nationInventoryReadMapper.queryN3501(orgid); Integer index = 0; uploadRemainingCnt = uploadRemainingCnt+n3501List.size()*2; for(Map<String,Object> obj:n3501List){ // 记录序号 index++; // 记录总体进度 HisInvUploadInfoBDO hisInvUploadInfoBDO = new HisInvUploadInfoBDO(); hisInvUploadInfoBDO.setFixmedinsCode(fixmedinsCode); hisInvUploadInfoBDO.setFixmedinsName(fixmedinsName); hisInvUploadInfoBDO.setFixmedinsSyscode(fixmedinsSyscode); hisInvUploadInfoBDO.setFixmedinsSyscodeName(fixmedinsSyscodeName); hisInvUploadInfoBDO.setUploadSuccessCnt(uploadSuccessCnt); hisInvUploadInfoBDO.setUploadFailCnt(uploadFailCnt); hisInvUploadInfoBDO.setUploadRemainingCnt(uploadRemainingCnt); hisInvUploadInfoBDO.setUploadStartTime(uploadStartTime); hisInvUploadInfoBDO.setValiFlag("1"); hisInvUploadInfoBDO.setCrterId("gm"); hisInvUploadInfoBDO.setCrterName("管理员"); hisInvUploadInfoBDO.setCrteTime(new Date()); hisInvUploadInfoBDO.setOpterId("gm"); hisInvUploadInfoBDO.setOpterName("管理员"); hisInvUploadInfoBDO.setOptTime(new Date()); hisInvUploadInfoBDO.setRevision(1); hisInvUploadInfoBDO.setFixmedinsAdmdvs(fixmedinsCode.substring(1,7)); hisInvUploadInfoBDO.setUploadStatus("01"); // 记录明显进度 HisInvUploadDetailBDO hisInvUploadDetailBDO = new HisInvUploadDetailBDO(); hisInvUploadDetailBDO.setFixmedinsCode(fixmedinsCode); hisInvUploadDetailBDO.setFixmedinsName(fixmedinsName); hisInvUploadDetailBDO.setFixmedinsSyscode(fixmedinsSyscode); hisInvUploadDetailBDO.setFixmedinsSyscodeName(fixmedinsSyscodeName); hisInvUploadDetailBDO.setValiFlag("1"); hisInvUploadDetailBDO.setCrterId("gm"); hisInvUploadDetailBDO.setCrterName("管理员"); hisInvUploadDetailBDO.setCrteTime(new Date()); hisInvUploadDetailBDO.setOpterId("gm"); hisInvUploadDetailBDO.setOpterName("管理员"); hisInvUploadDetailBDO.setOptTime(new Date()); hisInvUploadDetailBDO.setRevision(1); hisInvUploadDetailBDO.setUploadStatus("01"); hisInvUploadDetailBDO.setUploadSuccessCnt(uploadDtlSuccessCnt); hisInvUploadDetailBDO.setUploadFailCnt(uploadDtlFailCnt); hisInvUploadDetailBDO.setUploadRemainingCnt(uploadDtlRemainingCnt); hisInvUploadDetailBDO.setUploadStartTime(uploadStartTime); hisInvUploadDetailBDO.setUploadErrMsg(uploadErrMsg); hisInvUploadDetailBDO.setLinkInvDetailStartId(linkInvDetailStartId); hisInvUploadDetailBDO.setLinkInvDetailEndId(linkInvDetailEndId); hisInvUploadDetailBDO.setInfno(infno); hisInvUploadDetailBDO.setHisInvUploadDetailBId(hisInvUploadDetailBId); N3501InputDTO.Invinfo invinfo = JSON.parseObject(JSON.toJSONString(obj), N3501InputDTO.Invinfo.class); String trdnFlag = obj.get("trdnFlag").toString(); // 溯源码查询 Map<String,Object> queryTracode = new HashMap<>(); queryTracode.put("orgid",orgid); queryTracode.put("drugid",obj.get("drugid").toString()); queryTracode.put("ispiece",Integer.valueOf(trdnFlag)); queryTracode.put("sellStatus",1); // 溯源码已核销 List<Map<String, Object>> tracodeList= nationInventoryReadMapper.queryTracode(queryTracode); List<DrugtracinfoDTO> drugtracinfoDTOS = new ArrayList<>(); // 调用医保接口 String sequenceNumber = stringRedisTemplate.opsForValue().get("sequenceNumber"); if(ValidateUtil.isEmpty(sequenceNumber)){ sequenceNumber = "1000"; } String msgid = fixmedinsCode +(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+sequenceNumber); sequenceNumber = (Integer.valueOf(sequenceNumber)+1)+""; String msgid3502 = fixmedinsCode +(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+sequenceNumber); sequenceNumber = (Integer.valueOf(sequenceNumber)+1)+""; stringRedisTemplate.opsForValue().set("sequenceNumber", sequenceNumber.toString()); // 上传医保 3501 BusinessInput businessInput = new BusinessInput(); infno = "3501"; businessInput.setInfno(infno); businessInput.setFixmedinsCode(fixmedinsCode); businessInput.setFixmedinsName(fixmedinsName); businessInput.setMsgid(msgid); JSONObject inputJson = new JSONObject(); inputJson.put("invinfo",invinfo); businessInput.setInput(inputJson.toString()); BusinessOutput businessOutput = yiBaoDllCallService.dllBusinessByUrl(businessInput,Integer.valueOf(sequenceNumber)); // 记录进度 if("0".equals(businessOutput.getInfcode())){ uploadDtlSuccessCnt= uploadDtlSuccessCnt+1; uploadDtlRemainingCnt= n3501List.size()-uploadDtlSuccessCnt-uploadDtlFailCnt; uploadSuccessCnt= uploadSuccessCnt+1; uploadRemainingCnt= uploadRemainingCnt-1; hisInvUploadDetailBDO.setUploadStatus("02"); hisInvUploadInfoBDO.setUploadStatus("02"); if(uploadRemainingCnt==0){ hisInvUploadInfoBDO.setUploadStatus("03"); } if(uploadDtlRemainingCnt==0){ hisInvUploadDetailBDO.setUploadStatus("03"); } if(uploadFailCnt>0){ hisInvUploadInfoBDO.setUploadStatus("04"); } if(uploadDtlFailCnt>0){ hisInvUploadDetailBDO.setUploadStatus("04"); } }else{ uploadDtlFailCnt= uploadDtlFailCnt+1; uploadDtlRemainingCnt= n3501List.size()-uploadDtlSuccessCnt-uploadDtlFailCnt; uploadErrMsg = uploadErrMsg+"&"+(msgid+"-"+businessOutput.getErrMsg()); uploadFailCnt= uploadFailCnt+1; uploadRemainingCnt= uploadRemainingCnt-1; hisInvUploadDetailBDO.setUploadStatus("02"); hisInvUploadInfoBDO.setUploadStatus("02"); if(uploadRemainingCnt==0){ hisInvUploadInfoBDO.setUploadStatus("03"); } if(uploadDtlRemainingCnt==0){ hisInvUploadDetailBDO.setUploadStatus("03"); } if(uploadFailCnt>0){ hisInvUploadInfoBDO.setUploadStatus("04"); } if(uploadDtlFailCnt>0){ hisInvUploadDetailBDO.setUploadStatus("04"); } } // 记录医保日志 this.addChsTrnsLogC(businessInput,businessOutput); // // 3502的msgid ChsMedinsProdInvDDO chsMedinsProdInvDDO = new ChsMedinsProdInvDDO(); chsMedinsProdInvDDO.setMedinsProdInvNo(msgid); // 记录溯源码 for(Map tracode : tracodeList){ ChsFixmedinsProdInvTracDDO chsFixmedinsProdInvTracDDO = new ChsFixmedinsProdInvTracDDO(); Map filedMap = new HashMap(); filedMap.put("fixmedinsHilistId","medinsListCodg"); filedMap.put("fixmedinsHilistName","medinsListName"); this.setField(invinfo,chsFixmedinsProdInvTracDDO,filedMap); chsFixmedinsProdInvTracDDO.setOptinsNo(fixmedinsCode.substring(1,7)); chsFixmedinsProdInvTracDDO.setDrugTracCodg(tracode.get("tracecode").toString()); chsFixmedinsProdInvTracDDO.setFixmedinsCode(fixmedinsCode); chsFixmedinsProdInvTracDDO.setMedinsProdInvChgNo(msgid3502); chsFixmedinsProdInvTracDDO.setFixmedinsProdInvTracSn(UUID.fastUUID().toString().replaceAll("-", "").substring(0, 30)); DrugtracinfoDTO drugtracinfoDTO = new DrugtracinfoDTO(); drugtracinfoDTO.setDrugTracCodg(tracode.get("tracecode").toString()); drugtracinfoDTOS.add(drugtracinfoDTO); // 查询是否重复 if(chsFixmedinsProdInvTracDService.list(new QueryWrapper<ChsFixmedinsProdInvTracDDO>().lambda() .eq(ChsFixmedinsProdInvTracDDO::getFixmedinsCode, fixmedinsCode) .eq(ChsFixmedinsProdInvTracDDO::getDrugTracCodg, drugtracinfoDTO.getDrugTracCodg()) ).size()<1) { drugtracinfoDTOS.add(drugtracinfoDTO); chsFixmedinsProdInvTracDService.save(chsFixmedinsProdInvTracDDO); } } invinfo.setDrugtracinfo(drugtracinfoDTOS); // 3501写入数据库 Map filedMap = new HashMap(); filedMap.put("fixmedinsHilistId","medinsListCodg"); filedMap.put("fixmedinsHilistName","medinsListName"); this.setField(invinfo,chsMedinsProdInvDDO,filedMap); chsMedinsProdInvDDO.setFixmedinsCode(fixmedinsCode); chsMedinsProdInvDDO.setInvDate(invinfo.getInvdate()); chsMedinsProdInvDDO.setTrdnFlag(trdnFlag); chsMedinsProdInvDDO.setOptinsNo(fixmedinsCode.substring(1,7)); chsMedinsProdInvDDO.setLinkDb(linkDb); chsMedinsProdInvDDO.setLinkId(obj.get(linkIdName).toString()); if(index==1){ linkInvDetailStartId = obj.get(linkIdName).toString(); } linkInvDetailEndId = obj.get(linkIdName).toString(); chsMedinsProdInvDDO.setLinkTable("whse_batch"); chsMedinsProdInvDDO.setUploadOuptPara(JSONObject.toJSONString(businessOutput)); chsMedinsProdInvDDO.setUploadInptPara(JSONObject.toJSONString(businessInput)); chsMedinsProdInvDService.save(chsMedinsProdInvDDO); // 记录进度 hisInvUploadInfoBDO.setUploadSuccessCnt(uploadSuccessCnt); hisInvUploadInfoBDO.setUploadFailCnt(uploadFailCnt); hisInvUploadInfoBDO.setUploadRemainingCnt(uploadRemainingCnt); hisInvUploadInfoBDO.setUploadEndTime(new Date()); hisInvUploadInfoBDO.setHisInvUploadInfoBId(hisInvUploadInfoBId); if(hasInfoBId || index>1){ hisInvUploadInfoBService.updateById(hisInvUploadInfoBDO); }else{ hisInvUploadInfoBService.save(hisInvUploadInfoBDO); } hisInvUploadDetailBDO.setUploadSuccessCnt(uploadDtlSuccessCnt); hisInvUploadDetailBDO.setUploadFailCnt(uploadDtlFailCnt); hisInvUploadDetailBDO.setUploadRemainingCnt(uploadDtlRemainingCnt); hisInvUploadDetailBDO.setUploadStartTime(uploadStartTime); hisInvUploadDetailBDO.setUploadErrMsg(uploadErrMsg); hisInvUploadDetailBDO.setUploadEndTime(new Date()); hisInvUploadDetailBDO.setLinkInvDetailStartId(linkInvDetailStartId); hisInvUploadDetailBDO.setLinkInvDetailEndId(linkInvDetailEndId); hisInvUploadDetailBDO.setInfno(infno); hisInvUploadDetailBDO.setHisInvUploadDetailBId(hisInvUploadDetailBId); hisInvUploadDetailBDO.setHisInvUploadInfoBId(hisInvUploadInfoBId); if(index>1){ hisInvUploadDetailBService.updateById(hisInvUploadDetailBDO); }else{ hisInvUploadDetailBService.save(hisInvUploadDetailBDO); } // 3502 库存变更 N3502InputDTO.Invinfo invinfoChg = new N3502InputDTO.Invinfo(); BeanUtils.copyProperties(invinfo,invinfoChg); invinfoChg.setCnt(invinfo.getInvCnt()); invinfoChg.setPric(BigDecimal.valueOf(Double.parseDouble(obj.get("retailprc").toString()))); invinfoChg.setInvChgTime(invinfo.getInvdate()); invinfoChg.setInvChgType(InsuranceConstant.INV_CHG_TYPE_106); invinfoChg.setInvChgOpterName("管理员"); invinfoChg.setDrugtracinfo(drugtracinfoDTOS); // 上传医保 3502 businessInput = new BusinessInput(); infno = "3502"; businessInput.setInfno(infno); businessInput.setFixmedinsCode(fixmedinsCode); businessInput.setFixmedinsName(fixmedinsName); businessInput.setMsgid(msgid3502); inputJson = new JSONObject(); inputJson.put("invinfo",invinfoChg); businessInput.setInput(inputJson.toString()); businessOutput = yiBaoDllCallService.dllBusinessByUrl(businessInput,Integer.valueOf(sequenceNumber)); // 记录日志 this.addChsTrnsLogC(businessInput,businessOutput); // 记录进度 if("0".equals(businessOutput.getInfcode())){ uploadDtlSuccessCntN3502= uploadDtlSuccessCntN3502+1; uploadDtlRemainingCntN3502= n3501List.size()-uploadDtlSuccessCntN3502-uploadDtlFailCntN3502; uploadSuccessCnt= uploadSuccessCnt+1; uploadRemainingCnt= uploadRemainingCnt-1; hisInvUploadDetailBDO.setUploadStatus("02"); hisInvUploadInfoBDO.setUploadStatus("02"); if(uploadRemainingCnt==0){ hisInvUploadInfoBDO.setUploadStatus("03"); } if(uploadDtlRemainingCntN3502==0){ hisInvUploadDetailBDO.setUploadStatus("03"); } if(uploadFailCnt>0){ hisInvUploadInfoBDO.setUploadStatus("04"); } if(uploadDtlFailCntN3502>0){ hisInvUploadDetailBDO.setUploadStatus("04"); } }else{ uploadDtlFailCntN3502= uploadDtlFailCntN3502+1; uploadDtlRemainingCntN3502= n3501List.size()-uploadDtlSuccessCntN3502-uploadDtlFailCntN3502; uploadErrMsgN3502 = uploadErrMsgN3502+"&"+(msgid+"-"+businessOutput.getErrMsg()); uploadFailCnt= uploadFailCnt+1; uploadRemainingCnt= uploadRemainingCnt-1; hisInvUploadDetailBDO.setUploadStatus("02"); hisInvUploadInfoBDO.setUploadStatus("02"); if(uploadRemainingCnt==0){ hisInvUploadInfoBDO.setUploadStatus("03"); } if(uploadDtlRemainingCntN3502==0){ hisInvUploadDetailBDO.setUploadStatus("03"); } if(uploadFailCnt>0){ hisInvUploadInfoBDO.setUploadStatus("04"); } if(uploadDtlFailCntN3502>0){ hisInvUploadDetailBDO.setUploadStatus("04"); } } // 3502写入数据库 ChsMedinsProdInvChgDDO chsMedinsProdInvChgDDO = new ChsMedinsProdInvChgDDO(); filedMap = new HashMap(); filedMap.put("fixmedinsHilistId","medinsListCodg"); filedMap.put("fixmedinsHilistName","medinsListName"); this.setField(invinfoChg,chsMedinsProdInvChgDDO,filedMap); chsMedinsProdInvChgDDO.setFixmedinsCode(fixmedinsCode); chsMedinsProdInvChgDDO.setMedinsProdInvChgNo(msgid3502); chsMedinsProdInvChgDDO.setInvChgTime(invinfo.getInvdate()); chsMedinsProdInvChgDDO.setInvChgType(InsuranceConstant.INV_CHG_TYPE_101); chsMedinsProdInvChgDDO.setTrdnFlag(trdnFlag); chsMedinsProdInvChgDDO.setOptinsNo(fixmedinsCode.substring(1,7)); chsMedinsProdInvChgDDO.setLinkDb(linkDb); chsMedinsProdInvChgDDO.setLinkId(obj.get(linkIdName).toString()); chsMedinsProdInvChgDDO.setUploadOuptPara(JSONObject.toJSONString(businessOutput)); chsMedinsProdInvChgDDO.setUploadInptPara(JSONObject.toJSONString(businessInput)); chsMedinsProdInvChgDService.save(chsMedinsProdInvChgDDO); // 记录进度 hisInvUploadInfoBDO.setUploadSuccessCnt(uploadSuccessCnt); hisInvUploadInfoBDO.setUploadFailCnt(uploadFailCnt); hisInvUploadInfoBDO.setUploadRemainingCnt(uploadRemainingCnt); hisInvUploadInfoBDO.setUploadEndTime(new Date()); hisInvUploadInfoBDO.setHisInvUploadInfoBId(hisInvUploadInfoBId); hisInvUploadInfoBService.updateById(hisInvUploadInfoBDO); hisInvUploadDetailBDO.setUploadSuccessCnt(uploadDtlSuccessCntN3502); hisInvUploadDetailBDO.setUploadFailCnt(uploadDtlFailCntN3502); hisInvUploadDetailBDO.setUploadRemainingCnt(uploadDtlRemainingCntN3502); hisInvUploadDetailBDO.setUploadStartTime(uploadStartTime); hisInvUploadDetailBDO.setUploadErrMsg(uploadErrMsgN3502); hisInvUploadDetailBDO.setUploadEndTime(new Date()); hisInvUploadDetailBDO.setLinkInvDetailStartId(linkInvDetailStartId); hisInvUploadDetailBDO.setLinkInvDetailEndId(linkInvDetailEndId); hisInvUploadDetailBDO.setHisInvUploadDetailBId(hisInvUploadDetailBIdN3502); hisInvUploadDetailBDO.setHisInvUploadInfoBId(hisInvUploadInfoBId); hisInvUploadDetailBDO.setInfno(infno); if(index>1){ hisInvUploadDetailBService.updateById(hisInvUploadDetailBDO); }else{ hisInvUploadDetailBService.save(hisInvUploadDetailBDO); } } } },优化上诉代码
07-16
### 如何在 Java 中对 JSONObject 对象重新赋值或更新其属性 在 Java 中,`JSONObject` 是一种常用的数据结构来处理 JSON 数据。为了对 `JSONObject` 进行重新赋值或更新其属性,可以使用多种方法。 #### 使用 FastJSON 库进行重新赋值 FastJSON 提供了一种简单的方法来解析并修改 JSON 字符串。通过调用 `parseObject()` 方法将 JSON 字符串转换成 `JSONObject` 实例之后,可以直接设置新的键值对: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; // 将 JSON 字符串转化为 JSONObject 并对其指定字段重新赋值 String query_jsonstr = "{\"name\":\"Alice\",\"age\":25}"; JSONObject query = JSON.parseObject(query_jsonstr); query.put("age", 30); // 更新 age 属性为 30 System.out.println(query.toString()); // 打印更新后的 JSON 对象 ``` 这段代码展示了如何利用 fastjson 来创建一个新的 `JSONObject` ,并通过 `put()` 函数向其中添加新数据或将已有条目的值替换掉[^2]。 #### 利用反射机制给类成员变量赋值 当需要把整个 `JSONObject` 映射到自定义的 Java 类实例上时,则可以通过反射技术完成此过程。下面的例子说明了怎样编写一个名为 `fromJSONObject()` 的静态工厂方法用于此类映射操作: ```java public class Content { private String title; public static Content fromJSONObject(JSONObject jObj) throws Exception{ Content content = new Content(); java.lang.reflect.Field[] fields = Content.class.getDeclaredFields(); for (Field field : fields){ Object value = jObj.get(field.getName()); if(value != null && !value.equals(null)){ boolean accessible = field.isAccessible(); try { field.setAccessible(true); field.set(content,value); } finally { field.setAccessible(accessible); } } } return content; } } ``` 上述代码片段实现了从 `JSONObject` 向 Java Bean (`Content`) 的转换逻辑,并且能够动态地根据传入的对象调整目标实体的状态[^1]. #### 处理基本类型的更新 对于简单的场景下只需要更改某个特定键对应的值的情况来说,直接访问该键即可轻松实现这一点。例如: ```java org.json.simple.JSONObject jsonObject = new org.json.simple.JSONObject(); jsonObject.put("key","oldValue"); ... jsonObject.replace("key","newValue"); // 或者使用 put() 方法覆盖旧值 ``` 这里采用了 `replace()` 方法来安全地替换了原有的 `"key"` 键所关联的内容;当然也可以继续沿用之前提到过的 `put()` 方式达到相同的效果[^3]. 综上所述,在不同需求背景下可以选择合适的技术手段来进行 `JSONObject` 的重置工作。无论是采用第三方库简化流程还是深入底层运用反射特性都能很好地解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值