首页 > 解决方案 > 如何在c#中获取多行字符串的未知行中的字符索引

问题描述

我正在尝试从 Api 获取 covid-19 结果(仅有关伊朗的信息)并将其显示在文本框中。

我从 Api 获得的完整结果(所有国家/地区)是 json 格式。

所以为了只获得伊朗部分,我制作了一个函数,逐行遍历字符串的行,并检查该行中是否存在 a "{",如果是,则获取该索引并继续检查另一行中是否存在 a"}"并获取索引然后检查是否在这些之间,"Iran"然后在字符串中添加此文本(从“{”到“}”):

private string getBetween(string strSourceText, string strStartingPosition, string strEndingPosition)
{
    int Starting_CurlyBracket_Index = 0;
    int Ending_CurlyBracket_Index = 0;
    
    string FinalText = null;
    
    bool isTurnTo_firstIf = true;
    
    foreach (var line in strSourceText.Split('\r', '\n'))
    {
        if (isTurnTo_firstIf == true)
        {
            if (line.Contains(strStartingPosition))
            {
                Starting_CurlyBracket_Index = line.IndexOf(strStartingPosition); //i think problem is here
    
                isTurnTo_firstIf = false;
            }
        }
    
        else if (isTurnTo_firstIf == false)
        {
            if (line.Contains(strEndingPosition))
            {
                Ending_CurlyBracket_Index = line.IndexOf(strEndingPosition); //i think problem is here
    
                if (strSourceText.Substring(Starting_CurlyBracket_Index, Ending_CurlyBracket_Index - Starting_CurlyBracket_Index).Contains("Iran")) //error here
                {
                    FinalText = strSourceText.Substring(Starting_CurlyBracket_Index, Ending_CurlyBracket_Index - Starting_CurlyBracket_Index);
    
                    break;
                }
                else
                {
                    isTurnTo_firstIf = true;
                }
            }
        }
    }
    
   return FinalText;
}

我这样调用函数:

string OnlyIranSection = getBetween(Sorted_Covid19_Result, "{", "}"); //Sorted_Covid19_Result is the full result in json format that converted to string
textBox1.Text = OnlyIranSection;

但我得到这个错误:

在此处输入图像描述

我知道.. 这是因为它在当前行中获取索引,但我需要的是在中获取该索引,strSourceText所以我只能显示整个结果的这一部分:

在此处输入图像描述

标签: c#stringapiline

解决方案


使用 JSON
根据我阅读的评论,确实需要使用 JSON 实用程序来更轻松地满足您的需求。

您可以从这个基本示例开始:

static void Main(string[] args)
    {
        string jsonString = @"{
                                ""results"": [
                                                {""continent"":""Asia"",""country"":""Indonesia""},
                                                {""continent"":""Asia"",""country"":""Iran""},
                                                {""continent"":""Asia"",""country"":""Philippines""}
                                             ]
                              }";

        var result = JsonConvert.DeserializeObject<JsonResult>(jsonString);
        var iranInfo = result.InfoList.Where(i => i.Country.ToString() == "Iran").FirstOrDefault();
    }

    public class JsonResult
    {
        [JsonProperty("results")]
        public List<Info> InfoList { get; set; }
    }

    public class Info
    {
        public object Continent { get; set; }
        public object Country { get; set; }
    }

更新:使用索引
只要 JSON 的结构始终保持一致,那么这种示例解决方案就可以为您提供提示。

Console.WriteLine("Original JSON:");
        Console.WriteLine(jsonString);
        Console.WriteLine();

        Console.WriteLine("Step1: Make the json as single line,");
        jsonString = jsonString.Replace(" ", "").Replace(Environment.NewLine, " ");
        Console.WriteLine(jsonString);
        Console.WriteLine();

        Console.WriteLine("Step2: Get index of country Iran. And use that index to get the below output using substring.");
        var iranIndex = jsonString.ToLower().IndexOf(@"""country"":""iran""");
        var iranInitialInfo = jsonString.Substring(iranIndex);
        Console.WriteLine(iranInitialInfo);
        Console.WriteLine();

        Console.WriteLine("Step3: Get inedx of continent. And use that index to get below output using substring.");
        var continentIndex = iranInitialInfo.IndexOf(@"""continent"":");
        iranInitialInfo = iranInitialInfo.Substring(0, continentIndex-3);
        Console.WriteLine(iranInitialInfo);
        Console.WriteLine();

        Console.WriteLine("Step4: Get the first part of the info by using. And combine it with the initialInfo to bring the output below.");
        var beginningIranInfo = jsonString.Substring(0, iranIndex);
        var lastOpenCurlyBraceIndex = beginningIranInfo.LastIndexOf("{");
        beginningIranInfo = beginningIranInfo.Substring(lastOpenCurlyBraceIndex);
        var iranInfo = beginningIranInfo + iranInitialInfo;
        Console.WriteLine(iranInfo);

使用索引的输出:
在此处输入图像描述


推荐阅读