C# 反序列化带COUNT(b.status)等count属性JSON对象的最优方法
解决方案
最优方案:使用JsonProperty特性绑定特殊键名
直接在你的EventType实体类中新增对应count值的属性,通过Newtonsoft.Json提供的[JsonProperty]特性指定绑定JSON中的COUNT(b.status)键即可,无需修改现有反序列化逻辑,所有字段可自动完成解析:
public class EventType { // 原有属性保持不变,示例如下 public string name { get; set; } public string venueAdresse { get; set; } public string userID { get; set; } public string tblEventID { get; set; } public string venueCity { get; set; } public long startTimeAndDateUnixTicks { get; set; } public int displayStartTime { get; set; } public int slots { get; set; } // 新增属性,通过特性绑定JSON中的特殊键名 [JsonProperty("COUNT(b.status)")] public int StatusCount { get; set; } }
该方案对原有逻辑侵入性最低,性能损耗最小,是首选方案。
备选方案:手动从JObject提取值
如果不希望修改实体类定义,也可以直接操作JObject手动提取特殊键的值,无需把JToken转成字符串再反序列化,效率更高:
public static List<EventType> Deserialize(ApiResponse response) { // 全局设置只需要赋值一次,无需放在循环内重复创建 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List<JsonConverter> { new BooleanJsonConverter() } }; List<EventType> ad = new List<EventType>(); var array = (Newtonsoft.Json.Linq.JArray)response.payload; foreach (var item in array) { var jobj = item as JObject; // 先解析常规属性 var xy = jobj.ToObject<EventType>(); // 手动提取COUNT(b.status)的值赋值给对应属性 xy.StatusCount = jobj.Value<int>("COUNT(b.status)"); ad.Add(xy); } return ad; }
同时注意原代码中JsonConvert.DefaultSettings的赋值逻辑放在循环内会重复创建设置对象,移到循环外即可优化性能。
内容的提问来源于stack exchange,提问作者innom
相关产品推荐
相关产品推荐

