From 1dd600c7137d9b43e7971c68028acfe2b5bcdc12 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Wed, 1 Jul 2026 10:20:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20JSON=E6=97=A0=E9=A1=B5=E9=9D=A2=E8=A7=84?= =?UTF-8?q?=E5=88=99=E6=97=B6=E5=85=9C=E5=BA=95=E5=B1=95=E7=A4=BA=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E7=BB=93=E6=9E=84=EF=BC=8C=E6=B8=85=E7=90=86=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/par/core/adapter/AdapterEngine.java | 119 ++++++++++-------- 1 file changed, 67 insertions(+), 52 deletions(-) diff --git a/par-core/src/main/java/com/par/core/adapter/AdapterEngine.java b/par-core/src/main/java/com/par/core/adapter/AdapterEngine.java index 30d7c93..b5d2089 100644 --- a/par-core/src/main/java/com/par/core/adapter/AdapterEngine.java +++ b/par-core/src/main/java/com/par/core/adapter/AdapterEngine.java @@ -41,62 +41,77 @@ public class AdapterEngine { result.put("contentType", "json"); Map.Entry matched = matchPage(config.getPages(), accessUrl); - if (matched == null) { - result.put("matched", false); - result.put("message", "未匹配到页面规则"); - result.put("availablePages", new ArrayList<>(config.getPages() != null ? config.getPages().keySet() : Set.of())); - return result; - } - PageConfig page = matched.getValue(); - result.put("matched", true); - result.put("pageName", matched.getKey()); + if (matched != null && matched.getValue().getFields() != null && !matched.getValue().getFields().isEmpty()) { + // 有页面规则 → 按 selector 提取 + PageConfig page = matched.getValue(); + result.put("matched", true); + result.put("pageName", matched.getKey()); - if (page.getFields() == null || page.getFields().isEmpty()) { - result.put("message", "页面规则未定义字段"); - result.put("extracted", List.of()); - result.put("rowCount", 0); - result.put("fieldCount", 0); - return result; - } - - // 列表容器 - List items = new ArrayList<>(); - if (page.getListContainer() != null && !page.getListContainer().isBlank()) { - Object container = resolveJsonPath(parsed, page.getListContainer()); - if (container instanceof List) items = (List) container; - else items.add(parsed); - } else { - items.add(parsed); - } - - // 逐行提取字段 - List> rows = new ArrayList<>(); - int max = Math.min(items.size(), 50); - for (int i = 0; i < max; i++) { - Map row = new LinkedHashMap<>(); - boolean hasData = false; - for (Map.Entry field : page.getFields().entrySet()) { - String fieldName = field.getKey(); - FieldExtractor fe = field.getValue(); - if (fe.getSelector() == null) continue; - Object val = resolveJsonPath(items.get(i), fe.getSelector()); - if (val != null) hasData = true; - if (fe.getOptional() != null && fe.getOptional() && val == null) continue; - if (val instanceof String s) { - row.put(fieldName, applyTransform(s, fe.getTransform())); - } else if (val != null) { - row.put(fieldName, toDisplayString(val)); - } else { - row.put(fieldName, null); - } + List items = new ArrayList<>(); + if (page.getListContainer() != null && !page.getListContainer().isBlank()) { + Object container = resolveJsonPath(parsed, page.getListContainer()); + if (container instanceof List) items = (List) container; + else items.add(parsed); + } else { + items.add(parsed); } - if (hasData) rows.add(row); + + List> rows = new ArrayList<>(); + int max = Math.min(items.size(), 50); + for (int i = 0; i < max; i++) { + Map row = new LinkedHashMap<>(); + boolean hasData = false; + for (Map.Entry field : page.getFields().entrySet()) { + String fieldName = field.getKey(); + FieldExtractor fe = field.getValue(); + if (fe.getSelector() == null) continue; + Object val = resolveJsonPath(items.get(i), fe.getSelector()); + if (val != null) hasData = true; + if (fe.getOptional() != null && fe.getOptional() && val == null) continue; + if (val instanceof String s) { + row.put(fieldName, applyTransform(s, fe.getTransform())); + } else if (val != null) { + row.put(fieldName, toDisplayString(val)); + } else { + row.put(fieldName, null); + } + } + if (hasData) rows.add(row); + } + result.put("extracted", rows); + result.put("rowCount", rows.size()); + result.put("fieldCount", page.getFields().size()); + result.put("message", rows.isEmpty() ? "selector 未匹配到数据" : "共 " + rows.size() + " 行"); + } else { + // 无页面规则 → 兜底展示原始结构 + String reason = matched == null ? "未匹配到页面规则" : "页面规则未定义字段"; + result.put("matched", true); + result.put("pageName", "JSON原始结构"); + result.put("message", reason + ",展示原始数据"); + List> rows = new ArrayList<>(); + if (parsed instanceof Map) { + Map row = new LinkedHashMap<>(); + for (String key : ((Map) parsed).keySet()) { + row.put(key, toDisplayString(((Map) parsed).get(key))); + } + rows.add(row); + } else if (parsed instanceof List) { + int m = Math.min(((List) parsed).size(), 10); + for (int i = 0; i < m; i++) { + Map row = new LinkedHashMap<>(); + row.put("value", ((List) parsed).get(i)); + rows.add(row); + } + } else { + Map row = new LinkedHashMap<>(); + row.put("value", parsed); + rows.add(row); + } + result.put("extracted", rows); + result.put("rowCount", rows.size()); + result.put("fieldCount", rows.isEmpty() ? 0 : rows.get(0).size()); } - result.put("extracted", rows); - result.put("rowCount", rows.size()); - result.put("fieldCount", page.getFields().size()); - result.put("message", rows.isEmpty() ? "selector 未匹配到数据" : "共 " + rows.size() + " 行"); } catch (Exception e) { result.put("contentType", "json"); result.put("matched", false);