【问题标题】:using strings in c#.net在 c#.net 中使用字符串
【发布时间】:2012-07-01 04:13:50
【问题描述】:

嗨,我如何从以下字符串中检索数字,

{"number":100,"data":[test]}

数字可以是任意长度。

我使用了以下代码。但它给出了错误信息

strValue.Substring((strValue.IndexOf(":")+1), (strValue.IndexOf("data")));

输出是这样的

100,"数据":[

谢谢,

【问题讨论】:

  • 这看起来像是 JSON 字符串的开头。对吗?
  • 是的。错过了其他一点。 {"number":100,"data":test}
  • 查看每个函数调用的输出,看看是否有帮助。如果您仍然不确定,请在此处发布结果。
  • @Joshua 我编辑了您的问题以修复字符串。如果有错误,请告诉我,我会回滚。

标签: c# asp.net .net string substring


【解决方案1】:

看起来您的输入字符串是 JSON。是吗?如果是这样,您应该使用适当的 JSON 解析器库,例如 JSON.NET

【讨论】:

  • 发现根本问题的方法,而不仅仅是症状!我想我应该阅读有关使用 JSON 的内容,因为我不断看到人们在使用它。
  • @JonSenchyna 它像其他任何东西一样有利有弊。至关重要的是,它在控制字符上比 XML 轻得多,而且 ECMAScript 可以将其视为本机对象,因此对于 javascript 和其他 ECMAScript 实现来说非常方便。
  • +1 使用 JSON 的最佳方法。虽然如果只在代码中的一种情况下解析字符串,库可能会有点不必要的开销。
【解决方案2】:

我猜你需要使用 IndexOf(",") 而不是 IndexOf("data")

【讨论】:

    【解决方案3】:

    您的尝试已接近尾声。我发现了两个(可能是三个问题)。

    1. 您的字符串在您要查找的数字后面有一个逗号。由于您的代码正在搜索“数据”的索引,因此您的结束索引会超出一个字符。
    2. String.Substring(int, int) 的第二个参数实际上是长度,而不是结束索引。
    3. Strings are immutable in C#。因此,字符串上的任何成员函数都不会真正修改其值。相反,它们返回一个新值。我不知道您的代码示例是否完整,因此您可能正在将 SubString 的返回值分配给某些东西,但如果不是,最终结果是 strValue 保持不变。

    总的来说,您当前调用string.Substring 的结果是返回100,"data":[tes。 (据我所知,它没有存储结果)。

    试试下面的代码:

    string justTheNumber = null;
    // Make sure we get the correct ':'
    int startIndex = strValue.IndexOf("\"number\":") + 9;
    // Search for the ',' that comes after "number":
    int endIndex = strValue.IndexOf(',', startIndex);
    int length = endIndex - startIndex;
    // Note, we could potentially get an ArguementOutOfRangeException here.
    // You'll want to handle cases where startPosition < 0 or length < 0.
    string justTheNumber  = strValue.Substring(startIndex, length);
    

    注意:如果"number": 是字符串中列表中的最后一个条目,则此解决方案无法处理,但它应该处理其中的所有其他位置。

    如果您的字符串变得更复杂,您可以尝试使用Regular Expressions 来执行搜索。

    【讨论】:

    • 如果你使用strValue.IndexOf(",")),那会返回逗号所在的位置吗?你不应该传递你想要的子字符串的长度吗?喜欢strValue.IndexOf(",") - strValue.IndexOf(":")
    • 除了我发现的第一个明显问题之外,我没有仔细检查 OP 的代码是否存在其他问题。你是 100% 正确的。原始代码会找到以“:”开头的字符串,以及后面的 IndexOf(",") 字符。我会立即更新以上内容。
    【解决方案4】:

    以这种方式解析 JSON spring 是非常糟糕的做法,因为所有内容都是硬编码的。您是否考虑过使用 3rd 方库来解析 JSON 字符串,例如 Newtonsoft JSON

    【讨论】:

      【解决方案5】:

      正如 Jon 所说,您的输入字符串似乎是需要反序列化的 JSON 字符串。您可以编写自己的反序列化器,或使用现有库,例如Json.NET。这是一个例子:

      string json = @"[
        {
          ""Name"": ""Product 1"",
          ""ExpiryDate"": ""\/Date(978048000000)\/"",
          ""Price"": 99.95,
          ""Sizes"": null
        },
        {
          ""Name"": ""Product 2"",
          ""ExpiryDate"": ""\/Date(1248998400000)\/"",
          ""Price"": 12.50,
          ""Sizes"": null
        }
      ]";
      
      List<Product> products = JsonConvert.DeserializeObject<List<Product>>(json);
      

      【讨论】:

        猜你喜欢
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多