簡體   English   中英

發生一個或多個錯誤。 (無法反序列化當前的JSON對象(例如))

[英]One or more errors occurred. (Cannot deserialize the current JSON object (e.g))

嘗試從GoogleBook API反序列化一系列書籍對象。

型號: https : //pastebin.com/24S16hZc

確認的API響應: https : //pastebin.com/2q0aFGnf

預訂頁面:

  public BookingPage()
    {
        this.InitializeComponent();
        ResizeWindow();
        UpdateListView();

    }

    private void UpdateListView()
    {
        UserList_List.Items.Clear();

        foreach (HelperLibrary.UserObject L in App.GlobalUserList)
        {
            UserList_List.Items.Add($" { L.FirstName } { L.LastName }");

        }

        //Prepare task
        Task<HelperLibrary.Models.GoogleBook.RootObject[] > GetBooksTask = HelperLibrary.Helpers.APIHelper.SearchBooks("Hacker");

        GetBooksTask.Wait();

        HelperLibrary.Models.GoogleBook.RootObject[] Books = GetBooksTask.Result;

        foreach(HelperLibrary.Models.GoogleBook.RootObject P in Books)
        {
            BookList_list.Items.Add(P.volumeInfo.title);
        }


    }

API助手任務

 public class APIHelper
{
    private static string BaseURL = "https://www.googleapis.com/books/v1/volumes";

    public static async Task<HelperLibrary.Models.GoogleBook.RootObject[] > SearchBooks(string term)
    {

        using (var WebClient = new HttpClient { BaseAddress = new Uri(BaseURL) })
        {

            var ResponseHandler = WebClient.GetAsync($"?q= { term } ");


            if (ResponseHandler.Result.IsSuccessStatusCode)
            {
                string x = await ResponseHandler.Result.Content.ReadAsStringAsync();
                Debug.WriteLine(x);
                Models.GoogleBook.RootObject[] items = JsonConvert.DeserializeObject<Models.GoogleBook.RootObject[]>(await ResponseHandler.Result.Content.ReadAsStringAsync());
                return items;
            }
            else
            {
                return null;
            }


        }
    }




}

完整錯誤:

JsonSerializationException:無法將當前JSON對象(例如{“ name”:“ value”})反序列化為類型'System.Collections.Generic.List`1 [HelperLibrary.Models.GoogleBook + RootObject]',因為該類型需要JSON數組(例如[1,2,3])以正確反序列化。 要解決此錯誤,可以將JSON更改為JSON數組(例如[1,2,3]),也可以更改反序列化類型,使其成為普通的.NET類型(例如,不像整數這樣的原始類型,也不像這樣的集合類型)數組或列表),可以從JSON對象反序列化。 還可以將JsonObjectAttribute添加到類型中,以強制其從JSON對象反序列化。 路徑“種類”,第2行,位置8。

我已經在嘗試將其聲明為數組,而不是列表? 經歷過大多數其他話題,似乎找不到與我類似的情況。

您似乎誤解了RootObject是什么。 這樣定義的實際上是RootObject內部的內部對象。

我建議你這樣做;

1)將您的RootObject重命名為Item

    public class Item
    {
        public string kind { get; set; }
        public string id { get; set; }
        public string etag { get; set; }
        public string selfLink { get; set; }
        public VolumeInfo volumeInfo { get; set; }
        public LayerInfo layerInfo { get; set; }
        public SaleInfo saleInfo { get; set; }
        public AccessInfo accessInfo { get; set; }
    }

2)創建一個新的RootObject

public class RootObject
{
    public string kind { get; set; }
    public int totalItems { get; set; }
    public List<Item> items { get; set; }
}

然后,您的反序列化應如下所示;

Models.GoogleBook.RootObject root = 
JsonConvert.DeserializeObject<Models.GoogleBook.RootObject>(await ResponseHandler.Result.Content.ReadAsStringAsync());

檢查json的結構,如果我沒記錯的話,我認為您要獲取的是json的項目數組。 您可以做的是嘗試創建一個包含數組Root Object的父類,如下所示:

Public class RootParent
{
    public string kind {get; set;}
    public int totalItems {get;set;}
    public List<RootObject> items {get; set;}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM