標籤內 JSON 並反序列化
目標頁面返回的 HTML 結構為:
<html><body><pre>[{"year":"2015款","spec":[...]}]</pre></body></html>
需在 C# 中抓取 <pre> 標籤內的 JSON 字符串並解析為對象。
using (var client = new HttpClient()) {
string html = await client.GetStringAsync(url);
// 或 WebClient (舊版)
// string html = new WebClient().DownloadString(url);
}
<pre> 內容(正則 / HtmlAgilityPack)// 方案 A:正則(簡單場景)
var match = Regex.Match(html, @"<pre>(.*?)</pre>", RegexOptions.Singleline);
string json = match.Success ? match.Groups[1].Value : "";
// 方案 B:HtmlAgilityPack(健壯、推薦)
var doc = new HtmlDocument();
doc.LoadHtml(html);
string json = doc.DocumentNode.SelectSingleNode("//pre").InnerText;
// 定義對應模型
public class CarYear {
public string year { get; set; }
public int maxlen { get; set; }
public List spec { get; set; }
}
public class Spec {
public int id { get; set; }
public string name { get; set; }
}
// 反序列化
var list = JsonConvert.DeserializeObject>(json); // Newtonsoft
// 或 .NET Core 3.1+
var list = System.Text.Json.JsonSerializer.Deserialize>(json);
foreach (var yearGroup in list) {
Console.WriteLine($"年款: {yearGroup.year}, 車型數: {yearGroup.spec.Count}");
foreach (var spec in yearGroup.spec) {
Console.WriteLine($" ID:{spec.id} 名稱:{spec.name}");
}
}
using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using System.Collections.Generic;
class Program {
static async Task Main() {
string url = "https://example.com/api/cars";
using (var http = new HttpClient()) {
string html = await http.GetStringAsync(url);
var match = Regex.Match(html, @"<pre>(.*?)</pre>", RegexOptions.Singleline);
if (!match.Success) { Console.WriteLine("未找到 標籤"); return; }
string json = match.Groups[1].Value;
var data = JsonConvert.DeserializeObject>(json);
// 業務邏輯...
}
}
}
Newtonsoft.Json 功能全、兼容舊版;System.Text.Json 性能高、無依賴(.NET Core 3.1+)。try-catch 並記錄日誌。User-Agent、Cookie、代理 IP 等策略。核心邏輯:**HTTP 獲取 → HTML 解析提取 JSON 片段 → JSON 反序列化 → 業務處理**,三步走清晰可維護。