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

时间:2019-04-03 22:06:24

标签: c#

寻找正确方向的点

我有一个大字符串。

字符串中的

有一个数字。我在使用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行中

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

问题

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

2 个答案:

答案 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;

}

在以下位置调用它:

  • s = JSON
  • 前缀=“ @ odata.count \”:“
  • terminator =','
  • maxCharsToSearch =但是您想在放弃之前搜索JSON中的许多字符

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

这可能会以几种方式破坏,包括:

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

使用不安全的代码,您可能会更快地执行此操作,可能使用稍短的前缀等方式来做一些不同的循环,但是再次,查看其性能,然后决定是否要花费更多时间使它更快。