fix: JSON解析提取extracted统一赋值,简单值兜底,嵌套对象安全序列化

This commit is contained in:
mediabot-pt
2026-07-01 10:09:51 +08:00
parent 00c37bf4eb
commit 82a234a6b2

View File

@@ -48,26 +48,24 @@ public class AdapterEngine {
result.put("matched", true);
result.put("pageName", "JSON响应");
List<Map<String, Object>> rows = new ArrayList<>();
if (parsed instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) parsed;
result.put("message", "JSON 对象,共 " + map.size() + " 个顶层字段");
// 展示顶层字段
List<Map<String, Object>> rows = new ArrayList<>();
Map<String, Object> row = new LinkedHashMap<>();
for (String key : map.keySet()) {
Object val = map.get(key);
row.put(key, val instanceof String ? val : objectMapper.writeValueAsString(val));
row.put(key, toDisplayString(val));
}
rows.add(row);
result.put("extracted", rows);
result.put("rowCount", 1);
result.put("fieldCount", map.size());
} else if (parsed instanceof List) {
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) parsed;
result.put("message", "JSON 数组,共 " + list.size() + " 条记录");
List<Map<String, Object>> rows = new ArrayList<>();
int max = Math.min(list.size(), 20);
for (int i = 0; i < max; i++) {
Object item = list.get(i);
@@ -76,18 +74,26 @@ public class AdapterEngine {
@SuppressWarnings("unchecked")
Map<String, Object> m = (Map<String, Object>) item;
for (String key : m.keySet()) {
Object val = m.get(key);
row.put(key, val instanceof String ? val : objectMapper.writeValueAsString(val));
row.put(key, toDisplayString(m.get(key)));
}
} else {
row.put("value", item);
}
rows.add(row);
}
result.put("extracted", rows);
result.put("rowCount", list.size());
result.put("fieldCount", rows.isEmpty() ? 0 : rows.get(0).size());
} else {
// 简单值(string/number/boolean/null)
result.put("message", "JSON 简单值");
Map<String, Object> row = new LinkedHashMap<>();
row.put("value", parsed);
rows.add(row);
result.put("rowCount", 1);
result.put("fieldCount", 1);
}
result.put("extracted", rows);
} catch (Exception e) {
result.put("contentType", "json");
result.put("matched", false);
@@ -282,4 +288,12 @@ public class AdapterEngine {
if (s.equals("false") || s.equals("no") || s.equals("0") || s.equals("否")) return false;
return null;
}
/** 值转展示字符串(嵌套对象序列化,null → "null") */
private String toDisplayString(Object val) {
if (val == null) return "null";
if (val instanceof String s) return s;
if (val instanceof Number || val instanceof Boolean) return val.toString();
try { return objectMapper.writeValueAsString(val); } catch (Exception e) { return val.toString(); }
}
}