前言
透過 HttpClient 取得別的 API 結果 Json 字串後,要透過 JsonSerializer.Deserialize
發生該物件的屬性值都為 null 。這是為什麼呢?
研究
這是因為 System.Text.Json 預設的 formatters 是使用 Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions ,
而它的預設 format 是使用 camelCase 。 例如,
1 | public class Forecast |
預設 Json 的輸出為
1 | { |
這時透過 JsonSerializer.Deserialize
解法
因為 PropertyNameCaseInsensitive 屬性預設是 false ,所以可以將 Class 屬性加上 JsonPropertyName ,或是將 PropertyNamingPolicy 設定為 JsonNamingPolicy.CamelCase 。如果是別人的 Web API ,不確定用什麼格式的話,可以將 PropertyNameCaseInsensitive 設定成 true 。
1.JsonPropertyName
1 | public class Forecast |
2.PropertyNamingPolicy = JsonNamingPolicy.CamelCase
1 | var response = await httpClient |
3.PropertyNameCaseInsensitive = true
1 | var response = await httpClient |
- 註: 截至目前為止並無設定整個 JsonSerializerOptions 預設值的方式,而暫時解的方式可參考 How to globally set default options for System.Text.Json.JsonSerializer?
參考資料
JsonSerializer.Deserialize fails
JSON Serialization
Format response data in ASP.NET Core Web API
JsonSerializerOptions Class
Api proposal: Change JsonSerializerOptions default settings