You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:48:12