C#,不知道如何处理这个Json反序列化



长话短说,我正试图从对IBM的Watson的语音到文本调用中获得结果,并将最终转录成纯文本。转录的输出最终变成了这种格式的Json,

{
"result_index": 0,
"results": [
{
"final": true,
"alternatives": [
{
"transcript": "%HESITATION %HESITATION %HESITATION %HESITATION %HESITATION it is probably is actual words okay what's my best ",
"confidence": 0.74
}
]
}
]
}

当通过JSON到C#转换器运行时,会产生类似于的东西

public class Alternative
{
public string transcript { get; set; }
public double confidence { get; set; }
}
public class Result
{
public bool final { get; set; }
public List<Alternative> alternatives { get; set; }
}
public class Root
{
public int result_index { get; set; }
public List<Result> results { get; set; }
}

最终,我只想在备选方案下拿到这份成绩单,并将其发送到一个文本框中,但我一辈子都无法做到这一点,这是我所能做到的,不知道从这里到哪里才能拿到这份成绩单。

var bAudio = File.ReadAllBytes(file);
var memAudio = new MemoryStream(bAudio);
var results1 = speechToText.Recognize(memAudio, model: "en-US_NarrowbandModel");
Root resultsTranscription = JsonConvert.DeserializeObject<Root>(results1.Response); 

我最终得到0输出。我似乎无法完全理解这是如何将JSON分解为各种组件的

您不必让C#打破自己的命名约定并遵循JSON:

public class Alternative
{
[JsonProperty("transcript")]
public string Transcript { get; set; }
[JsonProperty("confidence")]
public double Confidence { get; set; }
}
public class Result
{
[JsonProperty("final")]
public bool Final { get; set; }
[JsonProperty("alternatives")]
public List<Alternative> Alternatives { get; set; }
}
public class Root
{
[JsonProperty("result_index")]
public int ResultIndex { get; set; }
[JsonProperty("results")]
public List<Result> Results { get; set; }
}

使用更复杂的网站,比如https://QuickType.iO(没有附属关系(来转换您的JSON,它将为您填充这些属性,这些属性为JSON指定一个名称,为csharp 指定另一个名称

您还可以从文件中进行流式传输,这样可以节省内存;不需要为了获得流而将文件加载到内存流中(好吧,除非Recognition真的需要MemoryStream;大多数基于流的东西都需要一个简单的stream,这样它们就可以从任何提供数据流的东西中获得;内存、文件、网络(:

using var audioStream = File.OpenRead(file);
var results1 = speechToText.Recognize(audioStream, model: "en-US_NarrowbandModel");
var resultsTranscription = JsonConvert.DeserializeObject<Root>(results1.Response);

然后您可以使用普通索引或linq风格的访问:

resultsTranscription.Results[0].Alternatives[0].Transcript;
resultsTranscription.Results.First().Alternatives.FirstOrDefault(a => a.Confidence > 0.7)?.Transcript;

例如,后一种形式得到置信度超过70%的第一个措辞。。