C#解析含多条结果的JSON字符串问题求助
问题分析与解决方案
你的代码无法正确解析JSON并获取字段值,核心问题是数据类结构与JSON不匹配,加上错误的访问方式导致的,以下是具体修正步骤:
1. 修正字段名与JSON的匹配问题
JSON字段名和你定义的类属性名存在多处不一致,必须调整:
TicketData类里的datas要改成data(对应JSON根节点的data数组),如果想保留原属性名,可添加[JsonProperty("data")]标记Data类里的requestor要改成requester(对应JSON里的requester字段)Data类里的statuses(列表类型)要改成status(单个对象类型,对应JSON里的status对象)Status类里的statusID改成statusId,parentID改成parentId,和JSON字段大小写保持一致
2. 修正数据类型不匹配问题
部分属性类型和JSON数据类型不符,会导致解析失败或值为null:
tags在JSON里是字符串数组,要把string改成List<string>solvedTimeJSON里存在null值,decimal是值类型不能为null,要改成可空类型decimal?type字段JSON里有null,可以改成string?(C# 8及以上版本支持)
3. 修正数据访问方式
summary是Data类的属性,TicketData里的data是列表集合,不能直接通过ticketData.summary访问,需要遍历列表或指定索引获取单个工单的字段。
修正后的完整数据类代码
using Newtonsoft.Json; public class TicketData { // 对应JSON根节点的data数组 public List<Data> data { get; set; } // 可选:如果需要解析metadata,添加该属性和对应类 public Metadata metadata { get; set; } } public class Data { public string assignedAppUser { get; set; } public decimal createTime { get; set; } public string description { get; set; } public int id { get; set; } public string priority { get; set; } // 修正字段名:requestor -> requester public string requester { get; set; } public string severity { get; set; } // 改成可空decimal,支持JSON中的null值 public decimal? solvedTime { get; set; } public string source { get; set; } // 修正类型与字段名:从List<Status>改为单个Status对象,字段名从statuses改为status public Status status { get; set; } public string summary { get; set; } // 改为字符串数组类型 public List<string> tags { get; set; } public string ticketForm { get; set; } public string triggeredCondition { get; set; } // 改为可空string,支持JSON中的null值 public string? type { get; set; } } public class Status { // 修正大小写:statusID -> statusId public int statusId { get; set; } public string displayName { get; set; } // 修正大小写:parentID -> parentId public int parentId { get; set; } } // 可选:如果需要解析metadata,添加该类 public class Metadata { public List<string> columns { get; set; } public List<SortByItem> sortBy { get; set; } public Dictionary<string, object> attributes { get; set; } public object filters { get; set; } public int lastCursorId { get; set; } public List<string> allColumns { get; set; } public List<string> columnNamesForExporting { get; set; } public List<string> allRequiredColumns { get; set; } } public class SortByItem { public string field { get; set; } public string direction { get; set; } }
正确的访问代码示例
解析后遍历工单列表,或获取指定索引的工单字段:
var ticketData = JsonConvert.DeserializeObject<TicketData>(tickets); // 遍历所有工单输出summary foreach (var ticket in ticketData.data) { Console.WriteLine(ticket.summary); } // 获取第一个工单的summary(需判断列表非空) if (ticketData.data != null && ticketData.data.Count > 0) { Console.WriteLine(ticketData.data[0].summary); }
内容的提问来源于stack exchange,提问作者GloryBee
相关产品推荐
相关产品推荐

