簡體   English   中英

Json 反序列化創建空對象

[英]Deserialization of Json creates null object

json 可以在這里找到: https : //www.googleapis.com/books/v1/volumes? q=harry+potter

我在將 json 反序列化為書籍對象列表時遇到問題。 我正在使用兩種模型,BookList 和 Books。 Book list 有一個名為 bookList 的屬性,它只是一個 Books 列表。

當代碼運行時,會創建一個 Book List 對象,但它為 null。

代碼如下:

書單.cs

using System.Collections.Generic;
using Newtonsoft.Json;

namespace HarryPotterBooksApp.Models
{
    public class BookList
    {
        [JsonProperty("items")]
        public List<Book> bookList {get;set;}
    }
}

書.cs

using Newtonsoft.Json;

namespace HarryPotterBooksApp.Models
{
    public class Book
    {
      
        [JsonProperty("id")]
        public string id { get; set; }
        [JsonProperty("publisher")]
        public string publisher { get; set; }

    }
}

圖書控制器.cs

namespace HarryPotterBooksApp.Controllers {
        public class BooksController: Controller {
            const string BASE_URL = "https://www.googleapis.com/books/v1/volumes?q=harry+potter";

            private readonly ILogger<BooksController> _logger;

            private readonly IHttpClientFactory _clientFactory;

            public BookList Books { get; set; }

            public bool GetBooksError { get; private set; }

            public BooksController (ILogger<BooksController> logger, IHttpClientFactory clientFactory)

            {

                _logger = logger;

                _clientFactory = clientFactory;

            }

            public async Task<IActionResult> Index ()

            {

                var message = new HttpRequestMessage ();

                message.Method = HttpMethod.Get;

                message.RequestUri = new Uri ($"{BASE_URL}api/Books");

                message.Headers.Add ("Accept", "application/json");

                var client = _clientFactory.CreateClient ();

                var response = await client.SendAsync (message);

                if (response.IsSuccessStatusCode) {

                    var responseString = await response.Content.ReadAsStringAsync();

                    Books = JsonConvert.DeserializeObject<BookList>(responseString);

                } else {

                    GetBooksError = true;

                    Books = new BookList();

                }

                return View (Books);

            }

看到微軟反序列化JSON的新庫了嗎? 它叫做 System.Text.Json,很神奇: https ://docs.microsoft.com/fr-fr/dotnet/api/system.text.json?view=netcore-3.1

你也有Json.NET通過Newtonsoft: https://www.newtonsoft.com/json

你的 JSON 看起來很復雜,一個解決方案是編寫每個對象並用每個對象反序列化 JSON(但它會太長)。 另一種解決方案是通過獲取所有屬性來構建表示。

您的模型與源 JSON 不匹配,因此這將是第一個問題。 JSON 有一個根對象——根不是一個列表。 該根包含 kind、totalItems 和 items。 書籍列表是“項目”。 您需要一個與此匹配的模型。 同樣,id 位於項目(您的 Book)對象中,但發布者位於子對象 (volumeInfo) 中。 如果您的模型不匹配,那么您對 ​​DeserializeObject 的調用將不起作用。

鑒於返回的 JSON 的復雜性,確保您的模型與此 JSON 匹配的最簡單方法可能是使用工具生成模型,例如https://json2csharp.com/https://app.quicktype.io/ ?l=csharp ,這將從示例 JSON 構建 C# 模型。 這將確保您的模型與 JSON 匹配並提供一個良好的起點。 如果您不需要屬性和子項,您可以隨時刪除它們。

暫無
暫無

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

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