将具有变量属性名称和嵌套列表的 JSON 反序列化为对象



我有一堆 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>();

相关内容

  • 没有找到相关文章

最新更新