Gson
在解析 JSON 字符串时期望一个 JSON 对象开始标记 {
,但实际遇到的是一个字符串。这表明传递给 Gson.fromJson
方法的输入并不是一个有效的 JSON 对象。生成的字符串并不是一个标准的 JSON 格式。这是因为把一个复杂的文本传递给了 Gson.fromJson
,而这个文本并没有被正确地转换为 JSON 对象。
解决方案
-
生成正确的 JSON 格式:
- 需要确保输入是一个有效的 JSON 对象。即使是从模板生成的字符串,也要符合 JSON 格式。
-
解析 JSON:
- 在从模板生成的字符串中提取出 JSON 部分进行解析。
示例代码
假设AI 助手返回了一个字符串形式的 JSON,这样做:
package com.sprint.questai.tool;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.sprint.questai.model.entity.UserCaseInfo;
import com.sprint.questai.model.enums.ChatModelEnums;
import com.sprint.questai.service.Assistant;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.service.AiServices;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
public class LegalCaseToolTest {
LegalCaseTool tool = new LegalCaseTool();
ChatLanguageModel model = ChatModelEnums.glm3.getValue();
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.build();
@Test
public void test() {
PromptTemplate template = PromptTemplate.from(",你要分析信息并提取信息,以json的形式返回,注意只需要返回json,不要加上Markdown 标记" +
"这是用户初始问题{{question}}," +
"下面是根据查询所获得的法条解释与案例分析:案例:{{cases}};法条解释:{{law}}" +
"下面我会给你用户提供的最新信息,示例的更新信息的形式如下:我当时把对方打到骨折了,然后想要逃跑的时候被警察带走了" +
"输出示例如下:{对方伤势:手臂骨折,是否自首:否}" +
"下面是用户提供的最新信息:{{info}}");
String info = "信息 是否醉驾:是;酒精浓度:120";
String question = "我喝了酒开车撞了人,被抓获了,会怎么判刑";
String cases = "【基本案情】\n" +
"2020年6月23日晚,邱某酒后驾车途遇南雄交警部门设卡查酒驾,邱某拒不配合交警调查撒腿就跑,并在抓捕过程中激烈反抗,采取咬、抓等方式导致多名交警不同程度受伤。经检测,邱某血样中乙醇含量为15.59mg/100ml,不属于醉酒驾驶机动车,不构成危险驾驶罪。但邱某暴力抗拒抓捕行为已涉嫌妨害公务罪,南雄检察院依法提起公诉。\n" +
"【裁判结果】\n" +
"南雄法院认为,邱某无视国家法律,以暴力方式阻碍人民警察依法执行职务,致一人轻微伤,其行为已构成妨害公务罪,犯罪事实清楚,证据确实、充分,依法判处被告人有期徒刑一年六个月。";
String law = "醉酒驾驶机动车辆,吊销驾照,5年内不得重新获取驾照,经过判决后处以拘役,并处罚金;醉酒驾驶营运机动车辆,吊销驾照,10年内不得重新获取驾照,终生不得驾驶营运车辆,经过判决后处以拘役,并处罚金。\n" +
"第九十一条,饮酒后驾驶机动车的,处暂扣六个月机动车驾驶证,并处一千元以上二千元以下罚款。因饮酒后驾驶机动车被处罚,再次饮酒后驾驶机动车的,处十日以下拘留,并处一千元以上二千元以下罚款,吊销机动车驾驶证。\n" +
"醉酒驾驶机动车的,由公安机关交通管理部门约束至酒醒,吊销机动车驾驶证,依法追究刑事责任;五年内不得重新取得机动车驾驶证。\n" +
"饮酒后驾驶营运机动车的,处十五日拘留,并处五千元罚款,吊销机动车驾驶证,五年内不得重新取得机动车驾驶证。\n" +
"醉酒驾驶营运机动车的,由公安机关交通管理部门约束至酒醒,吊销机动车驾驶证,依法追究刑事责任;十年内不得重新取得机动车驾驶证,重新取得机动车驾驶证后,不得驾驶营运机动车。\n" +
"饮酒后或者醉酒驾驶机动车发生重大交通事故,构成犯罪的,依法追究刑事责任,并由公安机关交通管理部门吊销机动车驾驶证,终生不得重新取得机动车驾驶证。";
Map<String, Object> map = new HashMap<>();
map.put("question", question);
map.put("cases", cases);
map.put("law", law);
map.put("info", info);
Prompt prompt = template.apply(map);
// 打印生成的提示字符串
System.out.println("生成的提示: " + prompt.text());
// 假设返回的字符串包含一个 JSON 对象
String jsonResponse = "{\n" +
" \"userCaseInfo\": {\n" +
" \"caseType\": \"酒驾撞人\",\n" +
" \"alcoholConcentration\": \"120\",\n" +
" \"injured\": \"是\",\n" +
" \"flight\": \"否\",\n" +
" \"resistanceToArrest\": \"否\",\n" +
" \"precedent\": \"邱某案例\"\n" +
" }\n" +
"}";
try {
UserCaseInfo keyValues = new Gson().fromJson(jsonResponse, UserCaseInfo.class);
System.out.println(keyValues);
} catch (JsonSyntaxException e) {
System.err.println("解析JSON失败,输入字符串为: " + jsonResponse);
e.printStackTrace();
}
}
@Test
public void extracttest() {
PromptTemplate template = PromptTemplate.from(",你要分析信息并提取信息,以json的形式返回,注意只需要返回json,不要加上Markdown标记,禁止使用markdown输出" +
"下面我会给你用户提供的最新信息,示例的更新信息的形式如下:我当时把对方打到骨折了,然后想要逃跑的时候被警察带走了" +
"输出示例如下:{对方伤势:手臂骨折,是否自首:否}" +
"下面是用户提供的最新信息:{{info}}");
String info = "信息 是否醉驾:是;酒精浓度:120";
String question = "我喝了酒开车撞了人,被抓获了,会怎么判刑";
Map<String, Object> map = new HashMap<>();
map.put("question", question);
map.put("info", info);
Prompt prompt = template.apply(map);
// 打印生成的提示字符串
System.out.println("生成的提示: " + prompt.text());
// 假设返回的字符串包含一个 JSON 对象
String jsonResponse = "{\n" +
" \"userCaseInfo\": {\n" +
" \"caseType\": \"酒驾撞人\",\n" +
" \"alcoholConcentration\": \"120\",\n" +
" \"injured\": \"是\",\n" +
" \"flight\": \"否\",\n" +
" \"resistanceToArrest\": \"否\",\n" +
" \"precedent\": \"邱某案例\"\n" +
" }\n" +
"}";
try {
UserCaseInfo keyValues = new Gson().fromJson(jsonResponse, UserCaseInfo.class);
System.out.println(keyValues);
} catch (JsonSyntaxException e) {
System.err.println("解析JSON失败,输入字符串为: " + jsonResponse);
e.printStackTrace();
}
}
}
关键点
- 生成正确的 JSON 格式:确保传递给
Gson.fromJson
方法的字符串是有效的 JSON 对象。 - 调试输出:在尝试解析 JSON 之前,输出生成的提示字符串,以便确认其格式。