You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:09:04