Как извлечь конкретную подстроку из строки в C #, используя цикл? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь извлечь только номер маршрута из ответа, полученного с веб-сервера.Ответ выглядит следующим образом;

[{"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;

    }

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

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();
0 голосов
/ 11 декабря 2018

То, что вы получаете, - это, в основном, строка 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();
...