From 290042789f6144028db0bfaad9ea1f1f9ee2233c Mon Sep 17 00:00:00 2001 From: youpaishidifu <1@ypshidifu.cn> Date: Wed, 28 Oct 2026 19:35:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC58=E6=89=B9=E4=BF=AE=E5=A4=8D2?= =?UTF-8?q?=EF=BC=9AAI=E9=85=8D=E7=BD=AE=E6=B7=B1=E5=BA=A6=E9=80=92?= =?UTF-8?q?=E5=BD=92=E6=9F=A5=E6=89=BE=E4=BE=9B=E5=BA=94=E5=95=86URL=20-?= =?UTF-8?q?=20findUrlInObject=20=E8=B7=AF=E5=BE=84=E7=BB=88=E7=82=B9?= =?UTF-8?q?=E9=81=87=E5=88=B0=E5=B5=8C=E5=A5=97=E5=AF=B9=E8=B1=A1=E6=97=B6?= =?UTF-8?q?=E6=B7=B1=E5=BA=A6=E9=80=92=E5=BD=92=E6=89=BE=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E4=B8=AAURL=20-=20=E6=96=B0=E5=A2=9E=20getElementIgnoreCase?= =?UTF-8?q?=EF=BC=9A=E5=A4=A7=E5=B0=8F=E5=86=99=E4=B8=8D=E6=95=8F=E6=84=9F?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=EF=BC=88=E8=AE=AF=E9=A3=9E=E6=98=9F=E8=BE=B0?= =?UTF-8?q?maas=20vs=20=E8=AE=AF=E9=A3=9E=E6=98=9F=E8=BE=B0MaaS=EF=BC=89?= =?UTF-8?q?=20-=20=E6=96=B0=E5=A2=9E=20findFirstUrlInObject=EF=BC=9A?= =?UTF-8?q?=E9=80=92=E5=BD=92=E9=81=8D=E5=8E=86=E5=B5=8C=E5=A5=97=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E6=89=BE=E7=AC=AC=E4=B8=80=E4=B8=AAhttp=20URL=20-=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=85=8D=E7=BD=AE=20=E8=AE=AF=E9=A3=9E/?= =?UTF-8?q?=E8=AE=AF=E9=A3=9E=E6=98=9F=E8=BE=B0MaaS=EF=BC=88=E4=B8=8D?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E5=AD=90=E9=A1=B9=EF=BC=89=E6=89=BE=E4=B8=8D?= =?UTF-8?q?=E5=88=B0URL=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Sdf1_login/AIChatManager.java | 44 ++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/java/Sdf1_login/AIChatManager.java b/src/main/java/Sdf1_login/AIChatManager.java index 6ffce44..8e52911 100644 --- a/src/main/java/Sdf1_login/AIChatManager.java +++ b/src/main/java/Sdf1_login/AIChatManager.java @@ -387,11 +387,51 @@ public class AIChatManager { return null; } + /** + * 大小写不敏感地获取 JsonObject 中的元素。 + * 先精确匹配,再大小写不敏感匹配(解决 讯飞星辰maas vs 讯飞星辰MaaS 的问题)。 + */ + private JsonElement getElementIgnoreCase(JsonObject obj, String key) { + JsonElement el = obj.get(key); + if (el != null) return el; + String lower = key.toLowerCase(); + for (Map.Entry entry : obj.entrySet()) { + if (entry.getKey().toLowerCase().equals(lower)) { + return entry.getValue(); + } + } + return null; + } + + /** + * 深度递归:在嵌套 JsonObject 中找第一个 http URL。 + * 不管嵌套多少层,找到第一个 http 开头的字符串值就返回。 + * 用于路径终点是对象而非直接 URL 的场景(如 讯飞/讯飞星辰MaaS 没有指定子项)。 + */ + private String findFirstUrlInObject(JsonObject obj) { + for (Map.Entry entry : obj.entrySet()) { + JsonElement el = entry.getValue(); + if (el.isJsonPrimitive()) { + String val = el.getAsString(); + if (val != null && val.startsWith("http")) return val; + } else if (el.isJsonObject()) { + String url = findFirstUrlInObject(el.getAsJsonObject()); + if (url != null) return url; + } + } + return null; + } + private String findUrlInObject(JsonObject obj, String[] parts) { - JsonElement el = obj.get(parts[0].trim()); + JsonElement el = getElementIgnoreCase(obj, parts[0].trim()); if (el == null) return null; if (parts.length == 1) { - return el.isJsonPrimitive() ? el.getAsString() : null; + // 路径终点:如果是字符串 → 直接返回 URL + if (el.isJsonPrimitive()) return el.getAsString(); + // ★ 深度递归:如果是对象 → 继续往下钻找第一个 URL + // 如 "讯飞/讯飞星辰MaaS" 没指定子项,钻入 MaaS 对象找第一个 URL + if (el.isJsonObject()) return findFirstUrlInObject(el.getAsJsonObject()); + return null; } if (el.isJsonObject()) { String[] rest = Arrays.copyOfRange(parts, 1, parts.length);