繁体   English   中英

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

[英]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;

}

你会在哪里称呼它:

  • s = JSON
  • 前缀 = "@odata.count\\": "
  • 终结者 = ','
  • maxCharsToSearch = 在放弃之前要搜索的 JSON 中有多少字符

此代码查找输入 JSON 字符串中具有前缀的部分,然后读取十进制数字中假定为 ASCII 字符的字符,直到遇到终止符为止,并返回该数字。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM