我有一堆 API,它在响应正文中生成以下 2 种回复:
{ "error": null, "object_type": { /* some object */ } }
{ "error": null, "object_type": [{ /* some object */ }, { /* some object */ }, ...] }
虽然我有一个与对象结构对应的类,但我想将 API 端点直接反序列化为类的对象或List<class>
,而无需创建一些"结果"类来匹配响应 JSON 结构。这可能吗?
例如,有 2 个 API:
/api/getAllCompanies
返回
{ "error": null, "company": [ { "name": "Microsoft", "country": "US" }, { "name": "Apple", "country": "US" } ]
而
/api/getUserCompany
返回
{ "error": null, "company": { "name": "Microsoft", "country": "US" } }
我有一个代码类:
public class Company {
string Name { get; set; }
string Country { get; set; }
}
如何在不创建一堆其他类的情况下直接将数据反序列化为 Company
对象或List<Company>
?
(JSON 属性名称 ( company
( 是已知的,因此不需要在其他地方提取它。
我一直在尝试首先将响应 JSON 反序列化为 ExpandoObject,然后使用此处的代码将属性复制到目标类的实例,然后使用以下代码进行转换,但这似乎不适用于列表。
private static async Task<T> GetApiObject<T>(string api, string extractedObjName) where T: class, new()
{
var retstr = await /* get API response as string */;
dynamic retobj = JsonConvert.DeserializeObject<ExpandoObject>(retstr, new ExpandoObjectConverter());
var ret = new T();
Mapper<T>.Map((ExpandoObject)((IDictionary<string, object>)retobj)[extractedObjName], ret);
return ret;
}
您可以使用 JObejct 提取所需的信息,然后再将其反序列化为对象。
var str = "{ "error": null, "company": [{ "name": "Microsoft", "country": "US" } ,{ "name": "Apple", "country": "US" } ]}";
var temp = JObject.Parse(str).GetValue("company");
var companies = temp.Select(x => x.ToObject<Company>()).ToList();
/api/getUserCompany
也是如此
var str = "{ "error": null, "company": { "name": "Microsoft", "country": "US" } }";
var temp = JObject.Parse(str).GetValue("company");
var company = temp.ToObject<Company>();