问题描述
可以在以下位置找到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匹配,并将提供一个良好的起点。如果不需要,可以随时删除属性和子级。