使用Newtonsoft将特殊结构JSON转换为C# Notes类列表的问题
解决JSON转List的问题
我明白你的问题了——这个JSON结构确实有点棘手,因为数组里的每一项不是直接的Notes对象,而是一个只包含单个键值对的字典:键是笔记的id字符串,值才是你需要的Notes数据。咱们来一步步搞定它:
核心问题分析
先再明确下你的JSON结构:
[{"12":{"id":"12","cdate":"2018-05-16 00:32:53","note":"Some notes will go here...","first_name":"Mark","last_name":"1"}}, {"13":{"id":"13","cdate":"2018-05-16 00:32:53","note":"Some notes will go here...","first_name":"Mark","last_name":"1"}}, {"14":{"id":"14","cdate":"2018-05-16 00:32:53","note":"Some notes will go here...","first_name":"Mark","last_name":"1"}}]
数组中的每个元素都是{ "id字符串": Notes数据 }的单键对象,直接反序列化为List<Notes>肯定会失败,因为JSON元素的结构和Notes类不匹配。
解决方案(基于Newtonsoft.Json)
方案1:先反序列化为字典列表,再提取值
这种方法直观易懂,先把每个数组元素转成字典,再取出字典里的Notes值:
// 假设你的原始JSON字符串为jsonStr var noteDictionaries = JsonConvert.DeserializeObject<List<Dictionary<string, Notes>>>(jsonStr); List<Notes> notesList = noteDictionaries.SelectMany(dict => dict.Values).ToList();
方案2:用JArray直接解析(更灵活)
如果需要更精细的控制,可以直接解析JSON数组,遍历每个元素并提取对应的Notes对象:
var jsonArray = JArray.Parse(jsonStr); List<Notes> notesList = jsonArray .Select(jObj => // 每个JObject只有一个键值对,取第一个值转成Notes jObj.First().ToObject<Notes>() ) .ToList();
处理日期和类型转换细节
如果遇到cdate日期格式解析失败的情况,可以配置序列化设置来指定日期格式:
var serializerSettings = new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd HH:mm:ss", Culture = CultureInfo.InvariantCulture }; // 用配置好的设置反序列化(方案1示例) var noteDictionaries = JsonConvert.DeserializeObject<List<Dictionary<string, Notes>>>(jsonStr, serializerSettings);
为什么你的原有代码没生效?
你之前的代码把对象转成JSON后解析成JObject,但原始数据是JSON数组(JArray),不是单个对象,方向一开始就错了。调整为解析JArray,就能正确遍历每个元素并提取数据了。
内容的提问来源于stack exchange,提问作者Hiren
相关产品推荐
相关产品推荐

