繁体   English   中英

Google api的.net json反序列化器失败,返回json结果

[英].net json deserializer failing for google api returned json result

在API调用期间,我无法反序列化从Google api获得的json结果。 API请求成功,但是无法反序列化。

反序列化的代码如下:

var datareceived = JsonConvert.DeserializeObject<RootObject>(response);

请在我从Google api获取的json下面找到(上面代码中的response对象):

{"result":[]}
{"result":[{"alternative":[{"transcript":"distance between the trees","confidence":0.46962094},{"transcript":"Justin prescription that reason"},{"transcript":"Justin Swift accessories"},{"transcript":"justice respiratory"},{"transcript":"Justin syska accessories"}],"final":true}],"result_index":0}

异常详细信息:

Message = "Additional text encountered after finished reading JSON content: {. Path '', line 2, position 0."

RootObject类别:

public class RootObject
{
    public List<Result> result { get; set; }
    public int result_index { get; set; }
}

任何帮助将不胜感激!

您可以利用以下方法在列表中获取JSON:

public List<string> GetJsonItems(string jsonString)
{
    int bracketCount = 0;
    List<string> jsonItems = new List<string>();
    StringBuilder Json = new StringBuilder();

    foreach (char c in jsonString)
    {
        if (c == '{')
            ++bracketCount;
        else if (c == '}')
            --bracketCount;
        Json.Append(c);

        if (bracketCount == 0 && c != ' ')
        {
            jsonItems.Add(Json.ToString());
            Json = new StringBuilder();
        }
    }
    return jsonItems;
}

然后像这样利用它:

List<string> strings = GetJsonItems(response.Replace(Environment.NewLine, String.Empty));

if (strings.Length > 1)
{
    List<Rootobject> allResultSet = new List<Rootobject>();
    foreach (var str in strings)
    {
        Rootobject items = JsonConvert.DeserializeObject<Rootobject>(str);
        if (items.result.Length > 0)
        {
            allResultSet.Add(items);
        }
    }
}

您只是无法解析此JSON,因为}表示JSON的结尾

但是你可以做这样的事情

string json = "{\"result\":[]}\r\n{\"result\":[{\"alternative\":[{\"transcript\":\"distance between the trees\",\"confidence\":0.46962094},{\"transcript\":\"Justin prescription that reason\"},{\"transcript\":\"Justin Swift accessories\"},{\"transcript\":\"justice respiratory\"},{\"transcript\":\"Justin syska accessories\"}],\"final\":true}],\"result_index\":0}";

string trueJson = json.Split(new[] { Environment.NewLine }, StringSplitOptions.None)[1];
try
{
    RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(trueJson);
    rootObject = rootObject;
}
catch (Exception ex)
{      
    throw;
}

public class Alternative
{
    public string transcript { get; set; }
    public double confidence { get; set; }
}

public class Result
{
    public List<Alternative> alternative { get; set; }
    public bool final { get; set; }
}

public class RootObject
{
    public List<Result> result { get; set; }
    public int result_index { get; set; }
}  

结果的每一行似乎都包含一个单独的JSON对象。 (尚不清楚API为何不返回实际的JSON数组。)在这种情况下,您可以将响应分为几行,并分别解析每一行:

string[] lines = response.Split(new char[]{'\r','\n'},StringSplitOptions.RemoveEmptyEntries);
var datareceived1 = JsonConvert.DeserializeObject<RootObject>(lines[0]);

... 等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM