Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串C返回部分值#_C# - Fatal编程技术网

C# 从字符串C返回部分值#

C# 从字符串C返回部分值#,c#,C#,我有一根大绳子。在字符串中,有一个数字。我正试图用C#返回那个数字 示例字符串: {“@odata.context”: "https://api.applicationinsights.io/v1/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/events/$metadata#自定义事件“, “@ai.messages”:[{”代码“:“AddedLimitToQuery”, “消息”:“查询限制为500行”}], @odata

我有一根大绳子。在字符串中,有一个数字。我正试图用C#返回那个数字

示例字符串:

{“@odata.context”: "https://api.applicationinsights.io/v1/apps/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/events/$metadata#自定义事件“, “@ai.messages”:[{”代码“:“AddedLimitToQuery”,
“消息”:“查询限制为500行”}], @odata.count:45,“值”:[{“id”:“xxxxxxxxxxxxx”,
“计数”:1

我的目标是将45作为int返回

“@odata.count”后的第一个数字:

我知道我可以用一些JSON到对象工具(例如newtonsoft)解析整个字符串。但是,在这种情况下,我需要非常高的性能,不想解析我不需要的数据

在本例中,我知道我需要的数据位于100000+JSON的前2或3行

我的目标是而不是通过尽可能快地获取单个值来解析整个对象

问题


如何获取特定文本字符串后面的第一个数字?

您不需要反序列化整个json,获取
Newtonsoft
,您需要

using Newtonsoft.Json.Linq;
代码:

var parsedJson=JObject.Parse(“你的整个json”);
var result=parsedJson[“@odata.count”].ToObject();
这样,您就可以在反序列化之前提取所需的Json,并且不需要任何新的类,如果您需要的值是一个基本类型,比如您的属性
int
。请尝试查看它是否如您所希望的那样快

如果您的属性嵌套在某个父对象中,您可以执行
parsedJson[“parent”][“@odata.count”]
。或者,如果它在某个列表中,则没有问题,但您需要首先循环遍历结果列表


检查

假设性能是绝对关键的(可能不是),并且这段代码是瓶颈(同样,可能不是)。您可以使用下面的代码,这接近于您可以做到的最快速度

但请注意,这假设您已经拥有完整的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;

}
public static int GetNum(字符串s,字符串前缀,字符终止符,int-maxCharsToSearch=10000)
{
int numChars=Math.Min(s.Length,maxCharsToSearch);
对于(int i=0;i
您可以用以下名称来称呼它:

  • s=JSON
  • 前缀=“@odata.count\”:
  • 终止符=','
  • maxCharsToSearch=在放弃之前要搜索JSON中的多少个字符
此代码查找输入JSON字符串中具有前缀的部分,然后读取假定为十进制数字中数字的ASCII字符的字符,直到找到终止符字符,然后返回数字

这可能会以多种方式中断,包括:

  • JSON不是ASCII格式
  • JSON的大小写与前缀中指定的不完全相同
  • 正在读取的数字不是整数或包含逗号/句点

您可以使用不安全的代码来加快这一速度,可能会以稍微不同的方式执行循环,使用较短的前缀,等等。但再次,请查看它的执行情况,然后决定是否要花费更多时间来加快这一速度。

您可以使用正则表达式,但我可能会选择使用然后,json.net只需获取解析后的值。这样,如果您需要其他值,您可以轻松获取它。忘记regex。它是json;像json一样使用它。不,不是regex!您是否考虑过基于阅读器的json解析,它可以将其视为流而不是加载整个图形?在您开始寻找异域解决方案之前,我只需解析json用通常的方法,看看你是否真的有性能问题。你需要10分钟才能确定。
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;

}