fix: build error
This commit is contained in:
parent
e9e5837a1f
commit
764b4d7420
|
|
@ -820,223 +820,9 @@ impl GeminiService {
|
|||
println!("❌ TolerantJsonParser解析失败: {}", e);
|
||||
println!("📝 响应内容预览: {}", &response[..response.len().min(200)]);
|
||||
|
||||
// 如果TolerantJsonParser也失败了,尝试回退到原有的修复方案
|
||||
println!("⚠️ 回退到传统修复方案");
|
||||
match self.fallback_json_extraction(response) {
|
||||
Ok(result) => {
|
||||
println!("✅ 传统修复方案成功");
|
||||
Ok(result)
|
||||
}
|
||||
Err(fallback_error) => {
|
||||
println!("❌ 传统修复方案也失败: {}", fallback_error);
|
||||
Err(anyhow!("所有JSON解析方案都失败了。TolerantJsonParser错误: {}; 传统方案错误: {}", e, fallback_error))
|
||||
}
|
||||
}
|
||||
// 直接返回错误,不使用回退方案,便于调试和问题定位
|
||||
Err(anyhow!("TolerantJsonParser解析失败: {}. 响应内容: {}", e, &response[..response.len().min(500)]))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// 回退的JSON提取方案(保留原有逻辑作为备用)
|
||||
fn fallback_json_extraction(&self, response: &str) -> Result<String> {
|
||||
println!("🔍 使用传统方法提取JSON");
|
||||
|
||||
// 尝试直接解析为JSON
|
||||
if let Ok(_) = serde_json::from_str::<serde_json::Value>(response) {
|
||||
println!("✅ 直接解析JSON成功");
|
||||
return Ok(response.to_string());
|
||||
}
|
||||
|
||||
// 查找JSON代码块 ```json ... ```
|
||||
if let Some(start) = response.find("```json") {
|
||||
println!("🔍 找到```json标记,位置: {}", start);
|
||||
let json_start = start + 7; // "```json".len()
|
||||
|
||||
// 从json_start位置开始查找结束的```
|
||||
if let Some(end_offset) = response[json_start..].find("```") {
|
||||
let json_end = json_start + end_offset;
|
||||
let json_content = response[json_start..json_end].trim();
|
||||
|
||||
println!("🔍 提取的JSON内容长度: {}", json_content.len());
|
||||
println!("🔍 JSON内容预览: {}", &json_content[..json_content.len().min(100)]);
|
||||
|
||||
// 验证提取的JSON
|
||||
match serde_json::from_str::<serde_json::Value>(json_content) {
|
||||
Ok(_) => {
|
||||
println!("✅ 从代码块提取JSON成功");
|
||||
return Ok(json_content.to_string());
|
||||
}
|
||||
Err(e) => {
|
||||
println!("❌ JSON解析失败: {}", e);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
println!("⚠️ 未找到结束的```标记,尝试修复截断的JSON");
|
||||
// 尝试修复截断的JSON
|
||||
let json_content = response[json_start..].trim();
|
||||
if let Ok(fixed_json) = self.legacy_fix_truncated_json(json_content) {
|
||||
println!("✅ 修复截断JSON成功");
|
||||
return Ok(fixed_json);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 查找普通的JSON对象 { ... }
|
||||
if let Some(start) = response.find('{') {
|
||||
println!("🔍 找到JSON对象开始位置: {}", start);
|
||||
|
||||
// 使用更智能的方法找到匹配的结束括号
|
||||
let mut brace_count = 0;
|
||||
let mut end_pos = None;
|
||||
|
||||
for (i, ch) in response[start..].char_indices() {
|
||||
match ch {
|
||||
'{' => brace_count += 1,
|
||||
'}' => {
|
||||
brace_count -= 1;
|
||||
if brace_count == 0 {
|
||||
end_pos = Some(start + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(end) = end_pos {
|
||||
let json_content = &response[start..=end];
|
||||
println!("🔍 提取的JSON对象长度: {}", json_content.len());
|
||||
|
||||
// 验证提取的JSON
|
||||
match serde_json::from_str::<serde_json::Value>(json_content) {
|
||||
Ok(_) => {
|
||||
println!("✅ 从对象提取JSON成功");
|
||||
return Ok(json_content.to_string());
|
||||
}
|
||||
Err(e) => {
|
||||
println!("❌ JSON对象解析失败: {}", e);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
println!("⚠️ 未找到匹配的结束括号");
|
||||
}
|
||||
}
|
||||
|
||||
// 如果无法提取有效JSON,尝试最后的修复方案
|
||||
println!("⚠️ 无法从响应中提取有效JSON,尝试最后的修复方案");
|
||||
|
||||
// 尝试从整个响应中修复JSON
|
||||
if let Ok(fixed_json) = self.legacy_fix_truncated_json(response) {
|
||||
println!("✅ 最后修复方案成功");
|
||||
return Ok(fixed_json);
|
||||
}
|
||||
|
||||
// 如果所有方法都失败了,返回错误
|
||||
Err(anyhow!("无法从Gemini响应中提取有效的JSON数据。响应内容: {}",
|
||||
response.chars().take(500).collect::<String>()))
|
||||
}
|
||||
|
||||
/// 传统的截断JSON修复方法(保留作为备用)
|
||||
fn legacy_fix_truncated_json(&self, json_str: &str) -> Result<String> {
|
||||
println!("🔧 尝试修复截断的JSON");
|
||||
|
||||
// 尝试解析部分JSON并提取有用信息
|
||||
let mut fixed_json = serde_json::json!({
|
||||
"environment_tags": ["Unknown"],
|
||||
"environment_color_pattern": {
|
||||
"hue": 0.0,
|
||||
"saturation": 0.0,
|
||||
"value": 0.5
|
||||
},
|
||||
"dress_color_pattern": {
|
||||
"hue": 0.0,
|
||||
"saturation": 0.0,
|
||||
"value": 0.5
|
||||
},
|
||||
"style_description": "",
|
||||
"products": []
|
||||
});
|
||||
|
||||
// 尝试提取环境标签
|
||||
if let Some(env_start) = json_str.find("\"environment_tags\"") {
|
||||
if let Some(array_start) = json_str[env_start..].find('[') {
|
||||
let start_pos = env_start + array_start;
|
||||
if let Some(array_end) = json_str[start_pos..].find(']') {
|
||||
let end_pos = start_pos + array_end + 1;
|
||||
let env_array_str = &json_str[start_pos..end_pos];
|
||||
if let Ok(env_tags) = serde_json::from_str::<Vec<String>>(env_array_str) {
|
||||
fixed_json["environment_tags"] = serde_json::json!(env_tags);
|
||||
println!("✅ 提取环境标签成功: {:?}", env_tags);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 尝试提取风格描述
|
||||
if let Some(desc_start) = json_str.find("\"style_description\"") {
|
||||
if let Some(quote_start) = json_str[desc_start..].find('"') {
|
||||
let start_pos = desc_start + quote_start + 1;
|
||||
// 查找下一个未转义的引号
|
||||
let mut end_pos = None;
|
||||
let mut chars = json_str[start_pos..].char_indices();
|
||||
while let Some((i, ch)) = chars.next() {
|
||||
if ch == '"' {
|
||||
// 检查是否是转义的引号
|
||||
let prev_char = if i > 0 {
|
||||
json_str[start_pos..].chars().nth(i - 1)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
if prev_char != Some('\\') {
|
||||
end_pos = Some(start_pos + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(end) = end_pos {
|
||||
let description = &json_str[start_pos..end];
|
||||
fixed_json["style_description"] = serde_json::json!(description);
|
||||
println!("✅ 提取风格描述成功");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 尝试提取颜色信息
|
||||
for (color_key, json_key) in [
|
||||
("environment_color_pattern", "environment_color_pattern"),
|
||||
("dress_color_pattern", "dress_color_pattern")
|
||||
] {
|
||||
if let Some(color_start) = json_str.find(&format!("\"{}\"", color_key)) {
|
||||
if let Some(obj_start) = json_str[color_start..].find('{') {
|
||||
let start_pos = color_start + obj_start;
|
||||
let mut brace_count = 0;
|
||||
let mut end_pos = None;
|
||||
|
||||
for (i, ch) in json_str[start_pos..].char_indices() {
|
||||
match ch {
|
||||
'{' => brace_count += 1,
|
||||
'}' => {
|
||||
brace_count -= 1;
|
||||
if brace_count == 0 {
|
||||
end_pos = Some(start_pos + i + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(end) = end_pos {
|
||||
let color_obj_str = &json_str[start_pos..end];
|
||||
if let Ok(color_obj) = serde_json::from_str::<serde_json::Value>(color_obj_str) {
|
||||
fixed_json[json_key] = color_obj;
|
||||
println!("✅ 提取{}成功", color_key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(fixed_json.to_string())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue