我正在使用繼承代碼,與本質上是第三方設備進行通信。我的開發套件是VS 2015,使用C#和NewtonSoft.Json庫。如何處理從JsonConvert.DeserializeObject返回的Json錯誤代碼<T>()
我的「頂級」程序看起來有點像這樣(的一些細節省略清晰):
public JsonResponse<T> SendTypedApiRequest<T>(JsonCommand command,
string apiPath, string description, int expectedResponseCode = 0)
{
try
{
var r = SendPost(apiPath, command);
if (r.Code == OK && r.Response != null) {
var jsonResponse = JsonResponse<T>.Deserialize(r.Response);
if (jsonResponse.RetCode != expectedResponseCode) {
// handle errors
}
}
}
catch(){};
}
在另一個文件中我有以下幾點:
public static JsonResponse<T> Deserialize(string json,
JsonSerializerSettings settings = null)
{
return JsonConvert.DeserializeObject<JsonResponse<T>>(json, settings);
}
我預計從返回這個帖子的設備是數字值,所以在這種情況下T是'int'(或者說是int的JsonResponse):
{"retCode":0,"retMsg":"OK","data":41272}
但是,當適當的條件沒有滿足,我得到這個:
{"retCode":1000,"retMsg":"No admin","data":{}}
似乎不夠公平嗎?但是,由於這是一個類型化的響應反序列化器,它會在{}上扼殺,希望得到一個整數而不是大括號。我得到的是一個JsonReaderException「解析值時遇到意外的字符:{。」我想得到的是來自Json響應的retCode和retMsg,所以我可以將實際的錯誤條件傳回給用戶。 JsonReaderException根本沒有幫助。
我嘗試使用JsonSerializerSettings的空值和空值,但它們在這種情況下不起作用。我似乎無法找到處理這種情況的標準方法。我可以在最後調用JsonConvert.DeserializeObject()的時候放一個try/catch來從響應中提取實際的錯誤並將它追回堆棧,但這看起來很粗糙和笨拙 - 沒有邏輯來處理直到我在代碼中達到3或4個級別(所有事情都期待輸入響應)。
有沒有一種優雅的方式來處理這個問題?有沒有一個規範的方法來處理這個問題?看來,我提出的每種方法都是笨拙和醜陋的,或根本不起作用。
TIA,戴夫
什麼是JsonResponse? – DavidG
我想你可以在這裏做兩件事。在您的模型中,將'data'更改爲可爲null的int。然後確保在啓用了忽略空值設置的情況下反序列化JSON。 – silkfire
JsonResponse如果是一個本地類 - 我錯過了,因爲我對Json相當陌生,而且這段代碼有很多的問題。如果有必要,我可以在這裏發佈該班的裸骨頭作爲編輯... – DaveN59