从服务器JSON文件提取Table与Label键值至列表的技术求助
提取JSON中的Table和Label字段技术协助
我从服务器获取的JSON数据片段如下(修正了原片段的语法错误):
[{"Table":"Starters","Label":"Starters","Columns":[{"Field":"Desc","Display":"Description"},{"Field":"Name","Display":"Starter Name"}]},
{"Table":"Main","Label":"Main Course","Columns":[{"Field":"Desc","Display":"Description"},{"Field":"Name","Display":"Main Course Name"}]}]
需求:读取该文件并仅提取其中的Table和Label信息,现有部分代码存在问题,请求协助修复。
现有代码
public static void getTables() { var path = HttpContext.Current.Server.MapPath(String.Format("{0}", ConfigurationManager.AppSettings["path"])); using(StreamReader file = File.OpenText(serverPath)){ string json = reader.ReadToEnd(); AddKeyWord(list, json, "Table, Label") } } private static void AddKeyWord(List<(string, string)> list, string infoString, string keys) { int lo; int hi = 0; string[] keyValues = keys.Split(","); for(int i = 0; i < keyValues.Length; i++){ while (hi < infoString.Length) { lo = infoString.IndexOf(keyValue[i], hi); //break condition if end of string if (lo == -1) return; hi = infoString.IndexOf(",", lo + keyValue[i].Length + 3); string value = infoString.Substring(lo, hi-lo); list.Add((keyValue[i],value)); } } }
现有代码问题分析
- 字符串索引解析JSON不可靠:靠字符串查找提取字段值,一旦JSON格式有微小变化(比如空格、换行、字段顺序调整)就会出错
- 语法错误:
serverPath未定义,应使用前面的path变量reader未定义,StreamReader实例是file,应该用file.ReadToEnd()AddKeyWord调用缺少分号keyValue[i]拼写错误,应为keyValues[i]
- 逻辑错误:外层按key循环,内层while遍历整个字符串,会导致重复处理或遗漏数据
推荐解决方案:使用JSON序列化库解析
处理JSON的标准方式是用专门的序列化库(比如Newtonsoft.Json或System.Text.Json),健壮性和可维护性远高于字符串解析。
步骤1:定义实体类
只需要定义需要提取的字段即可,其他字段会被自动忽略:
public class MenuTable { public string Table { get; set; } public string Label { get; set; } }
步骤2:重构getTables方法
方案1:使用Newtonsoft.Json(适用于.NET Framework)
public static List<(string Table, string Label)> getTables() { var path = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["path"]); var result = new List<(string, string)>(); using (var file = File.OpenText(path)) { string json = file.ReadToEnd(); // 解析JSON为实体列表 var menuTables = Newtonsoft.Json.JsonConvert.DeserializeObject<List<MenuTable>>(json); // 提取需要的字段 foreach (var table in menuTables) { result.Add((table.Table, table.Label)); } } return result; }
方案2:使用System.Text.Json(适用于.NET Core/.NET 5+)
public static List<(string Table, string Label)> getTables() { var path = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["path"]); var result = new List<(string, string)>(); using (var file = File.OpenText(path)) { string json = file.ReadToEnd(); var menuTables = System.Text.Json.JsonSerializer.Deserialize<List<MenuTable>>(json); foreach (var table in menuTables) { result.Add((table.Table, table.Label)); } } return result; }
方案优势
- 健壮性:自动处理所有合法的JSON格式,包括空格、换行、转义字符等
- 可读性:代码逻辑清晰,便于维护和扩展
- 扩展性:后续需要提取其他字段时,只需在实体类中添加对应属性即可
内容的提问来源于stack exchange,提问作者user20565161
相关产品推荐
相关产品推荐

