|
@@ -0,0 +1,270 @@
|
|
|
+package com.gqy.common.utils;
|
|
|
+
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class CustomJsonParser {
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取指定键的值
|
|
|
+ * @param input 输入字符串
|
|
|
+ * @param key 要查找的键
|
|
|
+ * @return 值,如果未找到返回null
|
|
|
+ */
|
|
|
+ public static String getParamValue(String input, String key) {
|
|
|
+ try {
|
|
|
+ // 移除所有多余的空格
|
|
|
+ input = input.replaceAll("\\s+", " ").trim();
|
|
|
+
|
|
|
+ // 构建可能的键模式
|
|
|
+ String[] patterns = {
|
|
|
+ key + ":", // 标准冒号
|
|
|
+ key + ":", // 中文冒号
|
|
|
+ "\"" + key + "\":", // 带引号的键
|
|
|
+ "\"" + key + "\":" // 带引号和中文冒号
|
|
|
+ };
|
|
|
+
|
|
|
+ int valueStart = -1;
|
|
|
+ int patternLength = -1;
|
|
|
+
|
|
|
+ // 查找第一个匹配的模式
|
|
|
+ for (String pattern : patterns) {
|
|
|
+ int index = input.indexOf(pattern);
|
|
|
+ if (index != -1) {
|
|
|
+ valueStart = index + pattern.length();
|
|
|
+ patternLength = pattern.length();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (valueStart == -1) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取值的结束位置
|
|
|
+ int valueEnd = findValueEnd(input, valueStart);
|
|
|
+
|
|
|
+ if (valueEnd == -1) {
|
|
|
+ valueEnd = input.length();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取值并处理特殊字符
|
|
|
+ String value = input.substring(valueStart, valueEnd).trim();
|
|
|
+
|
|
|
+ // 根据不同的键进行特殊处理
|
|
|
+ return cleanValue(value, key);
|
|
|
+ } catch (Exception e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清理值
|
|
|
+ */
|
|
|
+ private static String cleanValue(String value, String key) {
|
|
|
+ // 移除首尾引号
|
|
|
+ value = value.replaceAll("^\"*", "").replaceAll("\"*$", "");
|
|
|
+
|
|
|
+ // 根据不同的键进行特殊处理
|
|
|
+ if (key.equals("型号")) {
|
|
|
+ // 保留连字符和字母数字
|
|
|
+ value = value.replaceAll("[^\\w\\-]", "");
|
|
|
+ } else if (key.equals("控制盒")) {
|
|
|
+ // 移除特殊字符,保留中文、字母、数字
|
|
|
+ value = value.replaceAll("[\"{}\\[\\]\\\\}]", "");
|
|
|
+ } else {
|
|
|
+ // 其他字段移除特殊字符
|
|
|
+ value = value.replaceAll("[\"{}\\[\\]]", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ return value.trim();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查找值的结束位置
|
|
|
+ */
|
|
|
+ private static int findValueEnd(String input, int startIndex) {
|
|
|
+ int length = input.length();
|
|
|
+ boolean inBracket = false;
|
|
|
+ int bracketCount = 0;
|
|
|
+
|
|
|
+ for (int i = startIndex; i < length; i++) {
|
|
|
+ char c = input.charAt(i);
|
|
|
+
|
|
|
+ if (c == '{') {
|
|
|
+ inBracket = true;
|
|
|
+ bracketCount++;
|
|
|
+ } else if (c == '}') {
|
|
|
+ bracketCount--;
|
|
|
+ inBracket = bracketCount > 0;
|
|
|
+ } else if (!inBracket && (c == ',' || c == '}')) {
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取参数
|
|
|
+ * @param input
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Map getParam(String input){
|
|
|
+
|
|
|
+ Map maps = new HashMap();
|
|
|
+ // 工程名称 - 项目工程名称
|
|
|
+ String wk_name = getParamValue(input,"工程");
|
|
|
+
|
|
|
+ // 产品名称 - 产品的具体名称
|
|
|
+ String dcp_name = getParamValue(input,"产品名称");
|
|
|
+ // OA编码 - 产品在OA系统中的唯一编码
|
|
|
+ String dcp_oa_code = getParamValue(input,"OA编码");
|
|
|
+ // 系统类别 - 产品所属的系统分类
|
|
|
+ String sys_name = getParamValue(input,"系统类别");
|
|
|
+
|
|
|
+
|
|
|
+// int sys_no = Integer.parseInt(content.get("sys_no").toString());
|
|
|
+// int wr_id = Integer.parseInt(content.get("wr_id").toString());
|
|
|
+
|
|
|
+
|
|
|
+ // 箱体参数 - 产品箱体的物理参数
|
|
|
+ String dlpxthd = getParamValue(input,"厚"); // 厚度 - 箱体厚度(mm)
|
|
|
+ String dlpxtcl = getParamValue(input,"材质"); // 材质 - 箱体材质类型
|
|
|
+ String dlpdyxtlx = getParamValue(input,"类型"); // 类型 - 箱体类型
|
|
|
+
|
|
|
+ // 屏幕参数 - 显示屏幕的规格参数
|
|
|
+ String dlppmbl = getParamValue(input,"屏幕比例"); // 屏幕比例 - 显示屏幕的宽高比
|
|
|
+ String dlppmcc = getParamValue(input,"屏幕尺寸"); // 屏幕尺寸 - 显示屏幕的对角线尺寸(英寸)
|
|
|
+ String dlppmlx = getParamValue(input,"型号"); // 型号 - 屏幕的具体型号
|
|
|
+
|
|
|
+ // 投影机参数 - 投影设备的技术参数
|
|
|
+ String dlptyjld = getParamValue(input,"亮度"); // 亮度 - 投影机亮度(流明)
|
|
|
+ String dlpledkzh = getParamValue(input,"控制盒"); // 控制盒 - 投影机控制设备类型
|
|
|
+ String dlptyjlx = getParamValue(input,"光源"); // 光源 - 投影机光源类型
|
|
|
+
|
|
|
+ // 分辨率参数 - 显示分辨率规格
|
|
|
+ String dlpfblW = getParamValue(input,"W"); // 分辨率宽度(像素)
|
|
|
+ String dlpfblH = getParamValue(input,"H"); // 分辨率高度(像素)
|
|
|
+
|
|
|
+ // 尺寸参数 - 产品物理尺寸
|
|
|
+ String dlpxtkgk = getParamValue(input,"宽"); // 宽度(mm)
|
|
|
+ String dlpxtkgg = getParamValue(input,"高"); // 高度(mm)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 将所有参数添加到map中用于返回
|
|
|
+ maps.put("wk_name", wk_name); // 工程名称
|
|
|
+ maps.put("dcp_name", dcp_name); // 产品名称
|
|
|
+ maps.put("dcp_oa_code", dcp_oa_code); // OA编码
|
|
|
+ maps.put("sys_name", sys_name); // 系统类别
|
|
|
+
|
|
|
+
|
|
|
+ maps.put("dlpxthd", dlpxthd); // 箱体厚度
|
|
|
+ maps.put("dlpxtcl", dlpxtcl); // 箱体材质
|
|
|
+ maps.put("dlpdyxtlx", dlpdyxtlx); // 箱体类型
|
|
|
+
|
|
|
+ maps.put("dlppmbl", dlppmbl); // 屏幕比例
|
|
|
+ maps.put("dlppmcc", dlppmcc); // 屏幕尺寸
|
|
|
+ maps.put("dlppmlx", dlppmlx); // 屏幕型号
|
|
|
+
|
|
|
+ maps.put("dlptyjld", dlptyjld); // 投影机亮度
|
|
|
+ maps.put("dlpledkzh", dlpledkzh); // 控制盒类型
|
|
|
+ maps.put("dlptyjlx", dlptyjlx); // 光源类型
|
|
|
+
|
|
|
+ maps.put("dlpfblW", dlpfblW); // 分辨率宽度
|
|
|
+ maps.put("dlpfblH", dlpfblH); // 分辨率高度
|
|
|
+
|
|
|
+ maps.put("dlpxtkgk", dlpxtkgk); // 产品宽度
|
|
|
+ maps.put("dlpxtkgg", dlpxtkgg); // 产品高度
|
|
|
+
|
|
|
+ //处理特殊的尺寸组合
|
|
|
+ processSpecialDimensions(maps);
|
|
|
+
|
|
|
+ return maps;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理特殊的尺寸组合
|
|
|
+ * @param mapResult 需要处理的Map数据
|
|
|
+ */
|
|
|
+ private static void processSpecialDimensions(Map<String, Object> mapResult) {
|
|
|
+ // 处理第一组: dlpfblW 和 dlpfblH
|
|
|
+ Object fblW = mapResult.get("dlpfblW");
|
|
|
+ Object fblH = mapResult.get("dlpfblH");
|
|
|
+ if (fblW != null && fblH != null) {
|
|
|
+ String combinedFbl = fblW.toString() + "×" + fblH.toString();
|
|
|
+ mapResult.put("dlpfbl", combinedFbl); // 存储组合后的值
|
|
|
+ // 可选:移除原始键
|
|
|
+ mapResult.remove("dlpfblW");
|
|
|
+ mapResult.remove("dlpfblH");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理第二组: dlpxtkgk 和 dlpxtkgg
|
|
|
+ Object xtkgk = mapResult.get("dlpxtkgk");
|
|
|
+ Object xtkgg = mapResult.get("dlpxtkgg");
|
|
|
+ if (xtkgk != null && xtkgg != null) {
|
|
|
+ String combinedXtkg = xtkgk.toString() + "×" + xtkgg.toString();
|
|
|
+ mapResult.put("dlpxtkg", combinedXtkg); // 存储组合后的值 箱体宽高
|
|
|
+ // 可选:移除原始键
|
|
|
+ mapResult.remove("dlpxtkgk");
|
|
|
+ mapResult.remove("dlpxtkgg");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用示例
|
|
|
+ */
|
|
|
+ public static void main(String[] args) {
|
|
|
+ String input = "DDW{\tOA编码:,\t产品名称:DLP拼接单元,工程:视讯工程,系统类别:DLPPJXT,\t型号:DDW-60EF,\t箱体{\t类型:反射,\t材质:铁,\t尺寸{宽:1328,高:747,厚:850}\t},\t屏幕{\t型号:CSP-P,\t屏幕比例:16:9,\t屏幕尺寸:60\t}\t投影机{\t光源:LED3X4,\t分辨率{W:1920,H:1080},\t亮度:1200,\t控制盒:单电源\t},\t}\n" ;
|
|
|
+ // 测试不同的键
|
|
|
+ System.out.println("控制盒: " + getParamValue(input, "控制盒")); // 输出: 单电源
|
|
|
+ System.out.println("型号: " + getParamValue(input, "型号")); // 输出: DDW-60EF
|
|
|
+ System.out.println("亮度: " + getParamValue(input, "亮度")); // 输出: 1200
|
|
|
+ System.out.println("宽: " + getParamValue(input, "宽")); // 输出: 1328
|
|
|
+ System.out.println("材质: " + getParamValue(input, "材质")); // 输出: 单电源
|
|
|
+ System.out.println("产品名称: " + getParamValue(input, "产品名称")); // 输出: 厚
|
|
|
+
|
|
|
+ System.out.println("系统类别: " + getParamValue(input, "系统类别")); // 输出: 厚
|
|
|
+
|
|
|
+ System.out.println("W: " + getParamValue(input, "W"));
|
|
|
+ System.out.println("W: " + getParamValue(input, "H"));
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 提取所有键值对
|
|
|
+ */
|
|
|
+ public static List<String> extractAllValues(String input) {
|
|
|
+ List<String> results = new ArrayList<>();
|
|
|
+ String[] keys = {
|
|
|
+ "型号", "类型", "材质", "宽", "高", "厚",
|
|
|
+ "屏幕比例", "屏幕尺寸", "光源", "亮度", "控制盒"
|
|
|
+ };
|
|
|
+
|
|
|
+ for (String key : keys) {
|
|
|
+ String result = getParamValue(input, key);
|
|
|
+ if (result != null) {
|
|
|
+ results.add(result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return results;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|