C# Json的反序列化创建空对象

C# Json的反序列化创建空对象,c#,asp.net-mvc,C#,Asp.net Mvc,json可以在这里找到: 我在将json反序列化到book对象列表中时遇到问题。我用的是两种型号,书单和书。图书列表有一个名为bookList的属性,它只是一个图书列表 当代码运行时,将创建一个图书列表对象,但其为null 代码如下: BookList.cs using System.Collections.Generic; using Newtonsoft.Json; namespace HarryPotterBooksApp.Models { public class BookLi

json可以在这里找到:

我在将json反序列化到book对象列表中时遇到问题。我用的是两种型号,书单和书。图书列表有一个名为bookList的属性,它只是一个图书列表

当代码运行时,将创建一个图书列表对象,但其为null

代码如下:

BookList.cs

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

namespace HarryPotterBooksApp.Models
{
    public class BookList
    {
        [JsonProperty("items")]
        public List<Book> bookList {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);

            }
namespace HarryPotterBooksApp.Controllers{
公共类控制器:控制器{
常量字符串BASE_URL=”https://www.googleapis.com/books/v1/volumes?q=harry+波特”;
专用只读ILogger\u记录器;
私有只读IHttpClientFactory\u客户端工厂;
公共书目图书{get;set;}
public bool GetBooksError{get;private set;}
公共BookController(ILogger记录器,iHttpClient工厂客户端工厂)
{
_记录器=记录器;
_clientFactory=clientFactory;
}
公共异步任务索引()
{
var message=newhttprequestmessage();
message.Method=HttpMethod.Get;
message.RequestUri=新Uri($“{BASE_URL}api/Books”);
message.Headers.Add(“接受”、“应用程序/json”);
var client=_clientFactory.CreateClient();
var response=await client.sendsync(消息);
if(响应。IsSuccessStatusCode){
var responseString=await response.Content.ReadAsStringAsync();
Books=JsonConvert.DeserializeObject(responseString);
}否则{
GetBooksError=true;
图书=新图书列表();
}
返回视图(书籍);
}

你看到微软新的反序列化JSON的库了吗?它被称为System.Text.JSON,这很神奇:

还有Newtonsoft提供的Json.NET:

您的JSON看起来相当复杂,解决方案是编写每个对象并用每个对象对JSON进行反序列化(但会太长)。
另一个解决方案是通过获取所有属性来构建表示。

您的模型与源JSON不匹配,因此这将是第一个问题。JSON有一个根对象——根对象不是列表。该根包含种类、totalItems和items。图书列表是“items”。您需要一个与此匹配的模型。同样,id位于item(您的书)对象中,但发布者位于子对象(volumeInfo)中。如果您的模型不匹配,则对DeserializeObject的调用将不起作用


考虑到返回的JSON的复杂性,确保您的模型与此JSON匹配的最简单方法可能是使用工具(如or)生成一个模型,该工具将从示例JSON构建C#模型。这将确保您的模型与JSON匹配,并提供一个良好的起点。您始终可以删除属性和子项如果您不需要它们。

那么问题或您的问题是什么?您的意思是:另一种解决方案是通过获取所有属性来构建表示。使用JsonElement类迭代所有元素:
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);

            }