Как проанализировать JSON с вложенными массивами и передать определенные свойства представлению в .NET Core? - PullRequest
1 голос
/ 14 октября 2019

Вот что у меня есть для получения заголовка от этого API:

// Action Method 1 to list titles
public IActionResult Index()
{
    var path = path;
    HttpClient http = new HttpClient();
    var data = http.GetAsync(path).Result.Content.ReadAsStringAsync().Result;
    JObject r = JObject.Parse(data);
    IList<JToken> results = r["items"].Children()["volumeInfo"]["title"].ToList();
    ViewBag.myBooks= results;

    return View();
}

Как мне выполнить следующую часть? Вот самое близкое, что я получил:

// Action Method 2 to display properties

// Option 1 - bunch of foreach loops

var title = "myTitle" //temporary variable
foreach (var item in json["items"])
{
    foreach (var books in item["volumeInfo"]) 
    {
        if ((string)books["title"] == title) // Gives an error here saying "Cannot access child value on Newtonsoft.Json.Linq.JProperty"
        {
            Console.WriteLine(books);
        }
    }
}

Как мне разобрать этот JSON?

Я думал, что, получив это, я могу передать его своей модели (классу), используя:

JsonConvert.DeserializeObject<MyBooksClass>(jsonObject);

1 Ответ

1 голос
/ 14 октября 2019

Создайте следующие классы для десериализации в (некоторые свойства были удалены):

public class VolumeInfo
{
    public string Title { get; set; }
    public List<string> Authors { get; set; }
    public DateTime PublishedDate { get; set; }
    // any other properties you need, add here
}

public class Item
{
    public VolumeInfo VolumeInfo { get; set; }
}

public class RootObject
{
    public List<Item> Items { get; set; }
}

Затем создайте класс Book и спроецируйте результат в нужный класс с помощью Linq:

public class Book
{
    public string Title { get; set; }
    public string Authors { get; set; }
    public DateTime PublishedDate { get; set; }
}


// deserialize into classes
var response = JsonConvert.DeserializeObject<RootObject>(data); 
// project to List<Book>    
var myBooks = response.Items
                  .Select(d => new Book 
                  { 
                      Title = d.VolumeInfo.Title, 
                      Authors = string.Join(",", d.VolumeInfo.Authors), 
                      PublishedDate = d.VolumeInfo.PublishedDate 
                  })
                  .ToList();        

foreach (var book in myBooks)
{
    Console.WriteLine($"Title: {book.Title}, Authors: {book.Authors}, Date: {book.PublishedDate}"); 
}

Совет: вставьте json в Visual Studio («Правка» -> «Специальная вставка» -> вставьте JSON как классы) или используйте инструмент, подобный json2csharp , для автоматического создания классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...