Json的反序列化创建空对象

问题描述

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

我在将json反序列化为书籍对象列表时遇到问题。我使用两种模型,即BookList和Books。图书清单具有一个名为bookList的属性,该属性只是一本图书清单。

运行代码时,会创建一个Book List对象,但是它为null。

此处提供代码:

BookList.cs

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

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

Book.cs

using Newtonsoft.Json;

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

    }
}

BookController.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);

            }

解决方法

您是否看到Microsoft的新库反序列化JSON?它叫System.Text.Json,真是太神奇了:https://docs.microsoft.com/fr-fr/dotnet/api/system.text.json?view=netcore-3.1

您还拥有Newtonsoft的Json.NET:https://www.newtonsoft.com/json

您的JSON似乎很复杂,一种解决方案是编写每个对象,然后对每个对象反序列化JSON(但它会太长)。 另一种解决方案是通过获取所有属性来构建表示形式。

,

您的模型与源JSON不匹配,因此这将是第一个问题。 JSON具有单个根对象-根不是列表。该根包含kind,totalItems和项。书籍清单是“项目”。您需要一个与此匹配的模型。同样,id在项目(您的Book)对象中,而发布者在子对象(volumeInfo)中。如果您的模型不匹配,则对DeserializeObject的调用将无法正常工作。

鉴于返回的JSON的复杂性,也许确保模型与JSON匹配的最简单方法是使用https://json2csharp.com/https://app.quicktype.io/?l=csharp之类的工具来生成模型,该工具将构建示例JSON中的C#模型。这将确保您的模型与JSON匹配,并将提供一个良好的起点。如果不需要,可以随时删除属性和子级。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...