gpt4 book ai didi

c# - 将 JSON 反序列化为通用,其中集合属性名称根据类型更改

转载 作者:行者123 更新时间:2023-11-30 20:34:46 26 4
gpt4 key购买 nike

我正在使用 Newtonsoft.Json 解析一些 API 响应,它们似乎具有非常规则的结构,除了根据返回类型更改的数组属性名称。几个响应示例(带有假/空数据):

客户:

{
"success": true,
"message": "Records Retrieved Successfully",
"data": {
"total_count": "1",
"customer": [
{
"id": "1234",
"accountId": "220",
"email": "json.voorhees@lycos.com",
"name": "JSON Voorhees",
"company": "Test Company",
"customFieldsValues": [
{
"value": "Some Guy",
"field": {
"id": "69",
"name": "SalespersonID",
"label": "Account Manager"
}
}
]
}
]
}
}

发票:

{
"success": true,
"message": "Records Retrieved Successfully",
"data": {
"total_count": "0",
"invoice": []
}
}

你会注意到第一个数组的属性名称是“customer”,第二个是“invoice”(我们没有任何发票,所以我不知道到底是什么该对象的结构将是)。

我的最终目标是反序列化为这样的类结构:

public class Response {
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}

public class Response<T> : Response {
public List<T> Data { get; set; }
}

因为这不能通过简单的 DeserializeObject() 调用直接实现(因为业务对象数组包含在该中间“数据”属性中),这似乎更接近需要的东西,但问题是 [JsonProperty()] 属性的移动目标:

public class Response {
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}

public class Response<T> : Response {
public ResponseData Data { get; set; }
}

public class ResponseData<T> {
[JsonProperty("total_count")]
public int TotalCount { get; set; }

[JsonProperty("???")] //Moving target
public List<T> Data { get; set; }
}

实现这一目标的最明智方法是什么?

最佳答案

JavaScriptDeserializer 对象可以在这方面为您提供帮助,作为一个动态:

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });

dynamic obj = serializer.Deserialize(json, typeof(object));

然后,获取所有属性以测试对象具有哪些属性:

var propertyInfo = obj.GetType().GetProperties();

然后,获取你想要的属性名称并传入:

var value = obj.data[0].GetType().GetProperty(propertyName).GetValue(obj, null);

作为示例循环:

foreach (var property in obj.GetType().GetProperties()) {
Console.WriteLine(String.Format("The value for property {0} is {1}.",
property.Name,
obj.data[0].GetType().GetProperty(propertyName).GetValue(obj, null));
}

请注意,此答案使用了 System.Reflection,这对于大型计算来说非常慢(即,除非您有空余时间,否则不要重复这些方法数千次!)

关于c# - 将 JSON 反序列化为通用,其中集合属性名称根据类型更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38790554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com