C# 如何按JSON对象中FieldName字段对数组元素进行升序/降序排序
问题排查与修复方案
根因说明
- 实体类名与属性名重名冲突:你定义的数组元素类名称为
Information,同时外层实体类Informat下的数组成员也命名为Information,Newtonsoft.Json反射解析类型映射时会出现识别异常,触发反序列化报错。 - JSON格式不规范(可选触发原因):你提供的JSON样例中每个对象末尾存在多余尾逗号,不符合标准JSON规范,如果你实际解析的是带尾逗号的源数据也会触发反序列化失败。
修复步骤
1. 修改实体类避免命名冲突
将数组元素类改名,消除和属性名的重名歧义:
public class Informat { // 属性名保持和JSON的key一致 public InformationItem[] Information { get; set; } public object[] OtherInfo { get; set; } } // 修改类名避免冲突 public class InformationItem { public string FieldName { get; set; } public string Draft { get; set; } }
2. 调整业务代码,兼容异常JSON格式
反序列化时添加配置,兼容单引号、尾逗号等非标准JSON格式:
static void Main(string[] args) { string _json = "{'Information': [{'FieldName': 'Area04','Draft': 'Unknown'},{'FieldName': 'Area02','Draft': 'Unknown'},{'FieldName': 'Area01','Draft': 'Unknown'},{'FieldName': 'Area03','Draft': 'Unknown'}],'OtherInfo': []}"; // 配置反序列化参数,兼容非标准JSON格式 var deserializeSettings = new JsonSerializerSettings { // 忽略JSON尾逗号,Newtonsoft.Json 12.0+支持,低版本可删除该行 TrailingCommasHandling = TrailingCommasHandling.Ignore, // 允许单引号作为JSON引号 QuoteChar = '\'' }; var jObj = JsonConvert.DeserializeObject<Informat>(_json, deserializeSettings); // 升序排序,需要降序可替换为OrderByDescending var sortedInfo = jObj.Information.OrderBy(x => x.FieldName).ToArray(); // 回写排序结果到外层对象 jObj.Information = sortedInfo; // 序列化输出结果,Formatting.Indented可格式化输出方便查看 string finalJson = JsonConvert.SerializeObject(jObj, Formatting.Indented); Console.WriteLine(finalJson); }
效果验证
排序后的Information数组输出结果如下:
{ "Information": [ { "FieldName": "Area01", "Draft": "Unknown" }, { "FieldName": "Area02", "Draft": "Unknown" }, { "FieldName": "Area03", "Draft": "Unknown" }, { "FieldName": "Area04", "Draft": "Unknown" } ], "OtherInfo": [] }
内容的提问来源于stack exchange,提问作者DeSon
相关产品推荐
相关产品推荐

