.NET Framework中報錯命名空間System.Text中不存在類型或命名空間名Json

嚴重性 代碼 説明 項目 文件 行 禁止顯示狀態 錯誤 CS0234 命名空間“System.Text”中不存在類型或命名空間名“Json”(是否缺少程序集引用?) M3U8_Download F:\Merchant\merchant202501\autocookie\M3U8_Download\Form1.cs 84 活動
嚴重性 代碼  説明  項目  文件  行 禁止顯示狀態
錯誤  CS0234  命名空間“System.Text”中不存在類型或命名空間名“Json”(是否缺少程序集引用?) M3U8_Download F:\Merchant\merchant202501\autocookie\M3U8_Download\Form1.cs  84  活動

🔍 原因分析

System.Text.Json.NET Core 3.0 及以上(包括 .NET 5、6、7、8、9 等)才內置提供的 JSON 序列化庫。

如果你的項目是:

  • .NET Framework(如 .NET Framework 4.7.2、4.8 等), → 那麼默認不包含 System.Text.Json,會報這個錯。
✅ 方案一:升級項目到 .NET 5+(推薦)

如果你可以更改項目目標框架:

  1. 右鍵項目 → 屬性
  2. 目標框架 改為 .NET 6.NET 8 或更高(建議 .NET 8)
  3. 重新生成項目

這樣 System.Text.Json 就可以直接使用,無需額外安裝包。

✅ 方案二:在 .NET Framework 項目中使用 System.Text.Json(需手動安裝 NuGet 包)

如果你必須使用 .NET Framework(比如 WinForms 舊項目),可以安裝官方兼容包

// ExecuteScriptAsync 返回的是 JSON 格式的字符串 string jsonResult = await webView21.CoreWebView2.ExecuteScriptAsync(script); // 對於簡單類型,可以直接去除引號 return System.Text.Json.JsonSerializer.Deserialize<string>(jsonResult); 不安裝重新修改代碼解析

✅ 解決方案:手動解析簡單 JSON 字符串(無需任何額外庫)

ExecuteScriptAsync 的返回規則如下:

  • 如果 JS 返回的是 字符串,結果是帶雙引號的 JSON 字符串,例如:"hello" → C# 得到 "\"hello\""
  • 如果 JS 返回的是 數字、布爾、null,結果是無引號的:42truenull
  • 如果是對象或數組,會返回完整 JSON,如 {"a":1}

對於 只返回簡單字符串 的場景,你可以用 簡單的字符串處理 來“去 JSON 化”,而不需要反序列化庫。

情況 1:你確定 JS 返回的是 字符串

string jsonResult = await webView21.CoreWebView2.ExecuteScriptAsync(script);

// 去除首尾的雙引號,並處理轉義(簡單場景)
if (!string.IsNullOrEmpty(jsonResult) && jsonResult.StartsWith("\"") && jsonResult.EndsWith("\""))
{
    // 移除首尾引號,並將 \" 還原為 "
    string unquoted = jsonResult.Substring(1, jsonResult.Length - 2)
                                      .Replace("\\\"", "\"")
                                      .Replace("\\\\", "\\");
    return unquoted;
}
else if (jsonResult == "null")
{
    return null;
}
else
{
    // 不是字符串(比如返回了數字或布爾),直接返回原始內容
    return jsonResult;
}

✅ 推薦:使用 .NET Framework 自帶的 JavaScriptSerializer(無需安裝任何包!)

.NET Framework 本身就內置了 System.Web.Script.Serialization.JavaScriptSerializer完全免費、無需 NuGet

示例代碼:
using System.Web.Script.Serialization;

// ...

string jsonResult = await webView21.CoreWebView2.ExecuteScriptAsync(script);

var serializer = new JavaScriptSerializer();
// 如果 JS 返回的是字符串,jsonResult 是 "\"value\"",反序列化後得到 "value"
string result = serializer.Deserialize<string>(jsonResult);
return result;
  • 是 .NET Framework 官方自帶的類(雖然老舊,但夠用)

🔔 注意:你需要添加對 System.Web.Extensions 程序集的引用(大多數 WinForms 項目默認已包含,如果沒有):

  • 右鍵項目 → 添加引用 → 程序集 → 框架 → 勾選 System.Web.Extensions