[英]Returning part of a value from a string C#
我有一个很大的字符串。 在字符串中,有一个数字。 我正在尝试使用 C# 只返回那个数字
示例字符串:
{ "@odata.context": "https://api.applicationinsights.io/v1/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/events/$metadata#customEvents", "@ai.messages": [ { "code": "AddedLimitToQuery",
"message": "查询被限制为 500 行" } ], "@odata.count": 45, "value": [ { "id": "XXXXXXXXXXXXXXX",
“计数”:1...“
我的目标只是将45作为整数返回。
“@odata.count”之后的第一个数字:
我知道我可以使用一些 JSON 到对象工具(例如 newtonsoft)解析整个字符串。 但是,在这种情况下,我需要它非常高效并且不想解析我不需要的数据。
在这种情况下,我知道我需要的数据位于 100,000+ JSON 的前 2 或 3 行中。
我的目标不是仅仅通过尽可能快地获得单个值来解析整个对象。
题
如何获取特定文本字符串后面的第一个数字?
你不需要反序列化整个 json,得到Newtonsoft
,你需要
using Newtonsoft.Json.Linq;
代码:
var parsedJson = JObject.Parse("your_whole_json");
var result = parsedJson["@odata.count"].ToObject<int>();
通过它,您在反序列化之前提取了您需要的 Json 和平,并且您不需要任何新类,如果您需要的值是原始类型,例如您的属性int
。 试试看它是否像你想要的那样快。
如果您的属性嵌套在某个父对象中,您可以执行parsedJson["parent"]["@odata.count"]
。 或者,如果它在某个列表中,没问题,但是您需要先循环遍历结果列表...
检查https://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm
假设性能绝对至关重要(可能不是),并且这部分代码是瓶颈(同样,可能不是)。 您可以使用类似下面的方法,这接近于您能做到的最快速度。
但请注意,这假设您已经拥有完整的 JSON 字符串- 这意味着您已经在从磁盘下载/读取/任何内容时产生了非常大的性能成本。 下面的代码可以更改,因此不是必需的,但这取决于您如何开始获取 JSON。
public static int GetNum(string s, string prefix, char terminator, int maxCharsToSearch = 10000)
{
int numChars = Math.Min(s.Length, maxCharsToSearch);
for (int i = 0; i < numChars; i++)
{
for (int j = 0; j < prefix.Length && j + i < s.Length; j++)
{
char c1 = s[j + i];
char c2 = prefix[j];
if (c1 == c2)
{
if (j == prefix.Length - 1)
{
int num = 0;
for (int k = j + i + 1; k < s.Length && k < j + i + 10; k++)
{
char c = s[k];
if (c == terminator)
{
return num;
}
num *= 10;
num += c - 48;
}
return -1;
}
}
else
{
break;
}
}
}
return -1;
}
你会在哪里称呼它:
此代码查找输入 JSON 字符串中具有前缀的部分,然后读取十进制数字中假定为 ASCII 字符的字符,直到遇到终止符为止,并返回该数字。
这可能会以多种方式中断,包括:
您可能会使用不安全的代码使其更快,可能会以稍微不同的方式执行循环,使用更短的前缀等。但同样,请查看它的执行情况,然后决定是否要花更多时间使其更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.