【问题标题】:how do I extract a specific substring from a string in c# using a loop?如何使用循环从 c# 中的字符串中提取特定的子字符串?
【发布时间】:2018-12-10 20:12:18
【问题描述】:

我试图从我从 Web 服务器获得的响应中提取路由号。响应如下所示;

[{"Description":"METRO Blue Line","ProviderID":"8","Route":"901"},{"Description":"METRO Green Line","ProviderID":"8" ,"路线":"902"},

我只需要获取路线编号,以便我可以用它们填充组合框。我正在尝试使用循环,因为有很多。我当前的解决方案获得了第一个路由号码,但由于某种原因,我只获得了之后的提供商号码。这就是我到目前为止所拥有的。

        //get bus routes and popluate the busRoutecmb
        restClient.endPoint = routeUrl + formatLine;
        string response = restClient.request();

        //show me what was returned for debug puposes
        System.Diagnostics.Debug.Write(response);

        //sort through data and put relevent item in a list
        List<string> responseItems = new List<string>();
        //splitting into routes
        string[] splitByRoute = response.Split('}');

        //extracting route number from elements in splitByRoute
        List<string> extractedRouteNums = new List<string>();

        foreach (string thing in splitByRoute)
        {
            //splitting each bus route up by piece of information
            string[] splitByWord = thing.Split(',');
            //getting rid of everything but the route number
            int length = splitByWord.Length;
            int count = 2;
            while (count <= length)
            {
                string[] word = splitByWord[count].Split(':');
                string routeNum = word[1].Trim('"');
                count += 3;
                extractedRouteNums.Add(routeNum);
                System.Diagnostics.Debug.WriteLine(count);
                System.Diagnostics.Debug.WriteLine(routeNum);

            }

        }

        //add repsonse to busRoutecmb
        busRoutecmb.DataSource = extractedRouteNums;

    }

【问题讨论】:

  • 为什么不用 JSON.NET 来反序列化 JSON 字符串呢?您不需要使用字符串操作来解析它

标签: c# .net json string-formatting


【解决方案1】:

Gratzy 认为这是 JSON 是对的,但我建议您使用 JSON.NET 对其进行反序列化。

var items = JsonConvert.DeserializeObject<JArray>(response);
var routeNumbers = items.Select(i => i.Value<string>("Route")).ToList();

您还可以使用http://json2csharp.com/ 来生成强类型模型,并根据需要反序列化为该模型类型。

public class RootObject
{
    public string Description { get; set; }
    public string ProviderID { get; set; }
    public string Route { get; set; }
}

var items = JsonConvert.DeserializeObject<RootObject[]>(response);
var routeNumbers = items.Select(i => i.Route).ToList();

【讨论】:

    【解决方案2】:

    你得到的基本上是一个 JSON 字符串,它只是一个名称值对数组或一个字典列表。

      [{
            "Description": "METRO Blue Line",
            "ProviderID": "8",
            "Route": "901"
        },
        {
            "Description": "METRO Green Line",
            "ProviderID": "8",
            "Route": "902"
        }]
    

    您可以通过多种方式将该字符串反序列化为列表,其中一种是使用 System.Web.Script.Serialization.JavaScriptSerializer 或 JSON.NET。进入列表后,您可以查询该列表并仅返回路由键、值对。

        var data = "[{ Description:\"METROBlueLine\",ProviderID:\"8\",Route:\"901\"},{Description:\"METRO Green Line\",ProviderID:\"8\",Route:\"902\"}]";
    
                    var ser = new System.Web.Script.Serialization.JavaScriptSerializer();
                    var mylist = ser.Deserialize<List<Dictionary<string,string>>>(data);
        //or JSON.net
                    var mylist = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
    
                    var routes = mylist.SelectMany(a => a).Where(c => c.Key == "Route").ToList();
                    foreach (var route in routes)
                        Console.Write(route);
    
        output
        [Route, 901][Route, 902]
    

    如果你真的只想要这些值,那么

    var routesonly = routes.Select(r => r.Value).ToList();
    

    【讨论】:

    • JavaScriptSerializer 已过时。它的own documentation pageJson.NET should be used for serialization and deserialization. 开头
    • 当然可以,但我不想对 OP 有什么限制做出任何假设
    猜你喜欢
    • 2017-12-04
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多