使用JsonConvert.DeserializeObject时如何避免定义JSON对象根类
避免为每个API响应定义专属Root类的方法
问题场景
调用第三方API时,所有响应都遵循同一格式:外层是一个唯一键,对应内部的特定业务对象或数组。每次都要为响应单独定义Root类,操作繁琐,希望找到通用方案。
示例1:Token响应
JSON结构:
{ "token": { "accessToken": "scrciFyGuLAQn6XgKkaBWOxdZA1", "issuedAt": "2022-11-06T22:54:27Z", "expiresIn": 1799 } }
原有实现(需定义Root类):
public class Root { public Token Token { get; set; } } public class Token { public string AccessToken { get; set; } public DateTime IssuedAt { get; set; } public int ExpiresIn { get; set; } }
反序列化调用:
Root myRoot = JsonConvert.DeserializeObject<Root>(apiResponse);
示例2:User响应
JSON结构:
{ "user": { "preferences": {}, "address": {}, "name": {}, "email": "string", "segmentName": "string" } }
原有实现(需定义Root类):
public class Address { } public class Name { } public class Preferences { } public class Root { public User user { get; set; } } public class User { public Preferences preferences { get; set; } public Address address { get; set; } public Name name { get; set; } public string email { get; set; } public string segmentName { get; set; } }
补充响应示例
11月14日补充:单个Provider响应
{ "provider": { "TOTAL": { "count": 0 } } }
11月15日补充:Provider数组响应
{ "provider": [ { "accountType": [], "loginHelp": "string", "baseUrl": "string", "loginUrl": "string", "name": "string", "id": 0, "lastModified": "string", "status": "Supported" } ] }
通用解决方案
无需定义任何Root类,直接使用Dictionary<string, T>进行反序列化,其中T为实际业务对象类型(或集合类型):
1. 单一对象场景
针对返回单个业务对象的响应,指定Dictionary<string, 业务对象类型>,再通过键名取出目标对象:
// Token示例 Token token = JsonConvert.DeserializeObject<Dictionary<string, Token>>(apiResponse)["token"]; // User示例 User user = JsonConvert.DeserializeObject<Dictionary<string, User>>(apiResponse)["user"]; // 单个Provider示例 Provider provider = JsonConvert.DeserializeObject<Dictionary<string, Provider>>(apiResponse)["provider"];
2. 数组/集合场景
针对返回数组的响应,将T指定为List<业务对象类型>:
List<Provider> providers = JsonConvert.DeserializeObject<Dictionary<string, List<Provider>>>(apiResponse)["provider"];
内容的提问来源于stack exchange,提问作者SiBrit
相关产品推荐
相关产品推荐

