【问题标题】:How to filter JSON string如何过滤 JSON 字符串
【发布时间】:2019-09-21 08:01:41
【问题描述】:

在我的应用程序方法中,使用名为GetAllProvince()的方法填充JSON字符串如下,请注意GetAllProvince()是web方法

public string GetAllProvince()
{
    NccEntity nccEnti = getLtsLobbyInstance();
    DataTable dt = nccEnti.GetAllBranchesAndRegions();
    JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    return jsSerializer.Serialize(dt.Rows.Cast<DataRow>().GroupBy(row => row["RegionId"], row => row, (key, values) => new ProvinceWithBranches
    {
        Value = key.ToString(),
        Province = values.Select(row => row["RegionName"].ToString()).FirstOrDefault(),
        Branches = values.Select(row => new BranchItem
        {
            Value = row["BranchId"].ToString(),
            Province = row["BranchName"].ToString(),
            IsValid = row["IsTestBranch"].ToString()
        })
    }));
}

类名为ProvinceWithBranches

public class ProvinceWithBranches
{
    public string Value;
    public string Province;
    public IEnumerable<BranchItem> Branches;
}

类名为BranchItem

public class BranchItem
{
    public string Value;
    public string Province;
    public string IsValid;
}

上述生成JSON字符串的方法如下,

[
  {
    "Value": "21",
    "Province": "Default",
    "Branches": [
      {"Value": "1108", "Province": "davie", "IsValid": "False"},
      {"Value": "1107", "Province": "Ab area109", "IsValid": "False"},
      {"Value": "1105", "Province": "Hollywood", "IsValid":"False"},
      {"Value": "1105", "Province": "Ft. Lauderdale", "IsValid":"False"}
    ]
  },
  {
    "Value": "17",
    "Province": "East",
    "Branches": [
      {"Value": "212", "Province": "area109", "IsValid": "False"},
      {"Value": "219", "Province": "lauderdale", "IsValid": "False"}
    ]
  },
  {
    "Value": "24",
    "Province": "East11",
    "Branches": [
      {"Value": "211", "Province": "area108", "IsValid": "False"},
      {"Value": "218", "Province": "area109", "IsValid": "False"},
      {"Value": "1102", "Province": "area999", "IsValid": "False"}
    ]
  },
  {
    "Value": "25",
    "Province": "N25",
    "Branches": [
      {"Value": "213", "Province": "davie", "IsValid": "False"},
      {"Value": "220", "Province": "area999", "IsValid": "False"},
      {"Value": "220", "Province": "areda999", "IsValid": "False"}
    ]
  }
]

现在我的要求是我需要将参数作为GetAllProvince(string searcKey) 传递给该方法,并且基于searcKey 只有相关数据应该被过滤并返回,

如示例 1, 何时应返回 searcKey = Default 以下结果(所有匹配情况应返回根级别或分支级别)

[
  {
    "Value": "21",
    "Province": "Default",
    "Branches": [
      {"Value": "1108", "Province": "davie", "IsValid": "False"},
      {"Value": "1107", "Province": "Ab area109", "IsValid": "False"},
      {"Value": "1105", "Province": "Hollywood", "IsValid":"False"},
      {"Value": "1105", "Province": "Ft. Lauderdale", "IsValid":"False"}
    ]
  }
]

示例 2, 何时应返回 searcKey = area109 以下结果(所有匹配情况应返回根级别或分支级别)

[
  {
    "Value": "21",
    "Province": "Default",
    "Branches": [
      {"Value": "1107", "Province": "Ab area109", "IsValid": "False"},
    ]
  },
  {
    "Value": "17",
    "Province": "East",
    "Branches": [
      {"Value": "212", "Province": "area109", "IsValid": "False"}
    ]
  },
  {
    "Value": "24",
    "Province": "East11",
    "Branches": [
      {"Value": "218", "Province": "area109", "IsValid": "False"}
    ]
  }
]

我该怎么做,请帮帮我,我在这 2 天里忙得不可开交。非常感谢。

【问题讨论】:

  • 您可以控制nccEnti.GetAllBranchesAndRegions() 方法吗?在我看来,也许它正在运行某种 SQL?如果是这样,那可能是插入一些过滤条件的理想位置。所以nccEnti.GetAllBranchesAndRegions(string search),然后在该方法中应用适当的过滤条件。
  • ya GetAllBranchesAndRegions() 运行存储过程的方法。但是我需要通过这个方法过滤数据

标签: c# arrays json json.net


【解决方案1】:

我不会过滤 json 字符串。我会将 json 字符串反序列化为 ProvinceWithBranches 列表,然后循环读取 IEnumerable BranchItem 类,然后您可以对其进行 linq 查询。或者,如果您愿意,可以使用内部循环。我认为你几乎拥有你需要的东西。

或者你为什么不在 DataTable 上进行搜索。

【讨论】:

    【解决方案2】:

    反序列化为 ProvinceWithBranches 数组,然后

        private  IEnumerable<ProvinceWithBranches> Get(IEnumerable<ProvinceWithBranches> source,string filter)
              {
                 var firstConditionResults= source.Where(p => p.Province == filter);
                  var secondConditionResults = source.Where(p => p.Province  !=filter).Select(p=>new ProvinceWithBranches{
    Value = p.Value,
    Province = p.Province,
    Branches = p.Branches.Where(branch=>branch.Province==filter) } );
    
                  return firstConditionResults.Concat(secondConditionResults);
              }
    

    【讨论】:

    • 我应该在哪里应用这个方法
    • 请注意GetAllProvince()是网络方式
    • 据我了解,您必须过滤 ProvinceWithBranches 的集合,是吗?来源是这个集合,所以我改变参数让你理解,好吗?
    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2022-12-05
    • 2016-01-11
    • 2020-05-01
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多