Очистить JSON с веб-страницы с помощью C #

c# html-agility-pack

Вопрос

Новое для C # здесь и для запуска асинхронных задач.

Я пытаюсь очистить информацию о музыкальном альбоме с веб-сайта. Поиск веб-страницы создает объект JSON в открытом виде, но я не могу получить доступ к любой информации DOM. Вот что я пробовал (используя HtmlAgilityPack):

using HtmlAgilityPack;
using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1 {
public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    public async Task<String> AlbumScraper(string albumname) {

        HtmlWeb web = new HtmlWeb();

        string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=" + albumname);
        Console.Write(albumurl);
        var albumdoc = await Task.Factory.StartNew(() => web.Load(albumurl));
        string albumjson = "";

        if (albumdoc.DocumentNode != null) {
            albumjson = albumdoc.DocumentNode.InnerText;
        }

        return albumjson;
    }

    private async void Form1_Load(object sender, EventArgs e) {
        string rawtext = await AlbumScraper("rust+in+peace");
        Console.Write(rawtext);
    }
}
}

Как я могу получить текст JSON? Я вижу это четко, когда загружаю URL-адрес «albumurl» ...

Принятый ответ

Во-первых, вам не нужен HtmlAgilityPack.

Во-вторых, попробуйте:

using Newtonsoft.Json.Linq;

string albumurl = Uri.EscapeUriString("https://www.metal-archives.com/search/ajax-album-search/?field=title&query=rust+in+peace");
string doc = "";
using (System.Net.WebClient client = new System.Net.WebClient()) // WebClient class inherits IDisposable
{
    doc = client.DownloadString(albumurl);
}

то вы можете десериализировать его (@itikhomi)

AlbumSearchResponse data = JsonConvert.DeserializeObject<AlbumSearchResponse>(doc);

Вы также можете разобрать его вручную

JObject json = JObject.Parse(doc);
string error= Convert.ToString(json["error"]);
. . .
string aaData= Convert.ToString(json["aaData"]);
JArray arr = JArray.Parse(aaData);
foreach(JToken token in arr)
{
    string[] strarr = token.ToObject<string[]>();
}

Популярные ответы

Вы можете создать его с помощью онлайн-инструмента http://json2csharp.com/ Затем добавьте сгенерированный класс в свой код

public class AlbumSearchResponse
    {
        public string error { get; set; }
        public int iTotalRecords { get; set; }
        public int iTotalDisplayRecords { get; set; }
        public int sEcho { get; set; }
        public List<List<string>> aaData { get; set; }
    }

конвертировать текст ответа в класс

var data = JsonConvert.DeserializeObject<AlbumSearchResponse>(response);
        foreach (var item in data.aaData)
        {
            //do whatever your want with data
        }

также вам нужно добавить пакет newtonsoft json из nuget, чтобы заставить JsonConvert работать




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему