fix: build error
This commit is contained in:
parent
e9e5837a1f
commit
764b4d7420
|
|
@ -820,223 +820,9 @@ impl GeminiService {
|
||||||
println!("❌ TolerantJsonParser解析失败: {}", e);
|
println!("❌ TolerantJsonParser解析失败: {}", e);
|
||||||
println!("📝 响应内容预览: {}", &response[..response.len().min(200)]);
|
println!("📝 响应内容预览: {}", &response[..response.len().min(200)]);
|
||||||
|
|
||||||
// 如果TolerantJsonParser也失败了,尝试回退到原有的修复方案
|
// 直接返回错误,不使用回退方案,便于调试和问题定位
|
||||||
println!("⚠️ 回退到传统修复方案");
|
Err(anyhow!("TolerantJsonParser解析失败: {}. 响应内容: {}", e, &response[..response.len().min(500)]))
|
||||||
match self.fallback_json_extraction(response) {
|
|
||||||
Ok(result) => {
|
|
||||||
println!("✅ 传统修复方案成功");
|
|
||||||
Ok(result)
|
|
||||||
}
|
|
||||||
Err(fallback_error) => {
|
|
||||||
println!("❌ 传统修复方案也失败: {}", fallback_error);
|
|
||||||
Err(anyhow!("所有JSON解析方案都失败了。TolerantJsonParser错误: {}; 传统方案错误: {}", e, fallback_error))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 回退的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