【发布时间】:2014-01-15 12:36:08
【问题描述】:
我正在尝试在我的程序中实现 google 语音识别 api。为此,我使用下面的函数来解析从谷歌服务器发送的 json 文件。但是程序有时运行良好,有时运行不正常并出现访问冲突错误
代码如下。问题出在哪里?无论如何在解析之前检查json对象是否为真格式?
function TGoogleSpeech.Convert(const stream: TStream): string;
var
ret: string;
js: TlkJSONobject;
begin
try
ret := FHttp.Post(FURL, stream);
js := TlkJSON.ParseText(ret) as TlkJSONobject;
try
Result := js.Field['hypotheses'].Child[0].Field['utterance'].Value;
finally
js.Free;
end;
except
Result := '';
end;
end;
我正在使用the uLKJSOn library。
【问题讨论】:
-
如果发生了哪一行 AV ?什么是 AV 错误的完整文本?实现日志记录,当 AV 发生时将其与完整的服务器响应一起记录到文件中。您需要有可重现的输入数据。我的盲目猜测是,中间某处的
js.Field['hypotheses'].Child[0].Field['utterance'].Value;返回nil,因为您的数据没有该字段。将字符串拆分为每个语句一个点并检查 nil。然后看哪一行生成AV。喜欢var1 := js.Field['hypotheses']; /next line/ var2 := var1.Child[0]; /next line/ var3 := var2.Field [..]; var4 := .. -
您也可以尝试其他 json 库 stackoverflow.com/questions/14864170 但我认为您只有服务器响应而没有您认为必须存在的字段。我认为它们仅在某些时候存在,而在其他时候您尝试从 nil 中提取值。只是猜测
-
是的,我们知道您会遇到访问冲突。但是该语句至少有五个子表达式。哪一个是问题? Arioch 建议你如何解决这个问题。 Stack Overflow 不是个人调试服务。请改用从 Embarcadero 获得的调试器。查看
ret中的值;它总是包含你所期望的吗? -
反编译器?反编译器不是调试工具!请阅读我的第一条评论。您应该将您的超大行拆分为 5 条简单的行(“分而治之”),最好检查
varN := Var(N-1).xxxx; if nil = varN then raise Exception.Create('varN is nil!');然后如果发生异常 - 记录其文本并将谷歌响应值记录到文本文件中。您必须制作可重现的案例。您必须确定触发 AV 的ret和FURL的某些值 -
是的。您还没有分享更多问题。 “不起作用”是什么意思?
标签: json delphi speech-recognition access-violation