如何不使用循环通过JsonConvert等库将JSON转换为C# Student类对象列表
可以实现,无需手动编写循环,有两种常用实现方案,均基于Newtonsoft.Json(JsonConvert所属库)完成:
方案1:LINQ极简实现(无需自定义转换器)
该方案适合单次转换场景,代码量最少。
首先定义承接原始JSON结构的中间对象:
public class StudentRawResponse { public List<string> Header { get; set; } public List<List<string>> Rows { get; set; } }
转换代码如下,全程无手动for/foreach循环:
// 反序列化原始JSON var rawData = JsonConvert.DeserializeObject<StudentRawResponse>(yourJsonString); // 匹配header索引,避免硬编码下标带来的顺序兼容问题 var headerIndex = rawData.Header .Select((name, idx) => new { name = name.ToLower(), idx }) .ToDictionary(x => x.name, x => x.idx); // 直接用LINQ转换得到Student列表 List<Student> studentList = rawData.Rows .Select(row => new Student { id = row[headerIndex["id"]], name = row[headerIndex["name"]], address = row[headerIndex["address"]] }) .ToList();
方案2:自定义JsonConverter(适合多次复用)
如果需要频繁转换该结构的JSON,可以自定义转换器,后续转换只需一行代码:
首先实现自定义转换器:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; public class StudentListConverter : JsonConverter<List<Student>> { public override void WriteJson(JsonWriter writer, List<Student> value, JsonSerializer serializer) { // 序列化需求可自行实现,这里仅实现反序列化逻辑 throw new NotImplementedException(); } public override List<Student> ReadJson(JsonReader reader, Type objectType, List<Student> existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObj = JObject.Load(reader); var headers = jObj["header"].ToObject<List<string>>() .Select((name, idx) => new { name = name.ToLower(), idx }) .ToDictionary(x => x.name, x => x.idx); var rows = jObj["rows"].ToObject<List<List<string>>>(); return rows.Select(row => new Student { id = row[headers["id"]], name = row[headers["name"]], address = row[headers["address"]] }).ToList(); } }
后续转换直接调用即可:
List<Student> studentList = JsonConvert.DeserializeObject<List<Student>>(yourJsonString, new StudentListConverter());
内容的提问来源于stack exchange,提问作者Zulqarnain Jalil
相关产品推荐
相关产品推荐

