簡體   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