首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Newtonsoft.Json 反序列化字串多出雙引號?版本不匹配惹的禍

     編輯:關於C語言

現象重現

專案使用 Newtonsoft.Json 解析簡單 JSON 字串:

string jsonText = "{'name':'test','phone':'18888888888'}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string name = jo["name"].ToString();   // 預期 "test",實際得到 "\"test\""
string phone = jo["phone"].ToString(); // 預期 "18888888888",實際得到 "\"18888888888\""

取出的值竟然包含雙引號,導致後續比對、存儲全數失敗。

排查過程

  1. 檢查 JSON 格式:單引號雖非標準,但 Newtonsoft 預設支援,非主因。
  2. 嘗試 jo["name"].Value<string>()、(string)jo["name"] 皆同樣帶引號。
  3. 懷疑編碼、逃逸字元,逐一排除無果。
  4. 靈機一動檢查參考版本:專案引用的是 **Newtonsoft.Json.Net20** (針對 .NET 2.0 編譯),而專案實際運行於 **.NET 4.0** 環境。

根本原因

Net20 版組件在 .NET 4.0 執行時,內部字串處理行為與 4.0 版組件不一致,導致 JToken.ToString() 輸出包含引號的 JSON 字面值,而非純字串值。這是已知的跨版本相容性缺陷。

解決方案

  1. 從官網下載最新 Newtonsoft.Json 套件(含 net20、net35、net40、net45、netstandard 等多目標編譯)。
  2. 移除舊參考,安裝對應 **net40** 或 **net45** 版本的 DLL。
  3. 重新建置,問題即刻消失,ToString() 回傳純字串 "test"、"18888888888"。

最佳實踐提醒

  • 永遠匹配專案目標框架版本:.NET 4.x 專務必使用 net40/net45/netstandard2.0 等對應組件。
  • 優先使用 (string)jToken 或 jToken.Value<string>() 取值,語意更清晰且不受 ToString() 重寫影響。
  • 透過 NuGet 管理套件可自動解決版本一致性,避免手動複製 DLL 帶來的陷阱。

結語

一個「多出雙引號」的詭異 Bug,最終歸因於**組件目標框架與執行環境不匹配**。開發時請養成「版本對齊」習慣,能省去無數無效除錯時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved