c# - 如何在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
所以我只能显示整个结果的这一部分:
解决方案
使用 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);
推荐阅读
- swift - 使用 UIDropInteractionDelegate 和电影
- angular - 如何在角度中使用子路由来渲染其他视图细节
- sql - SQL 查询:按第一个和第二个日期透视数据
- javascript - 在页面重新加载之前没有 CSS 样式 - cssText 不起作用
- node.js - 为什么在 .ejs 文件中包含视图时无法识别视图?
- flutter - 如何在颤动中访问父级中子小部件的数据?
- angular - Angular ngOnChanges 无法第一次读取属性
- assembly - 在汇编中跳转到地址
- c++ - 在 llvm 6 中使用 PassManager
- android - 更新的解决方案:在 Android 应用的主屏幕应用名称中添加换行符