寻找正确方向的点
我有一个大字符串。
字符串中的有一个数字。我在使用C#尝试仅返回该数字
示例字符串
{“ @ odata.context”: “ https://api.applicationinsights.io/v1/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/events/ $ metadata#customEvents”, “ @ ai.messages”:[{“代码”:“ AddedLimitToQuery”,
“ message”:“查询仅限于500行”}], “ @ odata.count”:45,“ value”:[{“ id”:“ XXXXXXXXXXXXXXX”,
“计数”:1 ...”
我的目标只是将 45 作为整数返回
“ @ odata.count”之后的第一个数字:
我知道我可以使用JSON将整个字符串解析为对象工具,例如牛顿软件。但是,在这种情况下,我需要具有出色的性能,并且不想解析不需要的数据。
在这种情况下,我知道我需要的数据在100,000+ JSON的前2或3行中
我的目标不是不只是通过尽可能快地获取单个值来解析整个对象。
问题
如何获取特定文本字符串后面的第一个数字?
答案 0 :(得分:1)
您不需要反序列化整个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
答案 1 :(得分:0)
假设性能绝对关键(可能不是关键),并且这部分代码是瓶颈(再次可能不是)。您可以使用如下所示的方法,它几乎是最快的方法。
但是请注意,这是假设您已经拥有完整的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字符的字符,直到遇到终止符,然后返回数字。
这可能会以几种方式破坏,包括:
使用不安全的代码,您可能会更快地执行此操作,可能使用稍短的前缀等方式来做一些不同的循环,但是再次,查看其性能,然后决定是否要花费更多时间使它更快。