1

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

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

该数字可以是任意长度。

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

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

输出就像

100,“数据”:[

谢谢,

4

5 回答 5

10

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

于 2012-06-29T15:54:46.963 回答
3

你的尝试很接近。我发现了两个(可能是三个问题)。

  1. 您的字符串在您要查找的数字后面有一个逗号。由于您的代码正在搜索“数据”的索引,因此您的结束索引将结束一个字符。
  2. String.Substring(int, int)的第二个参数实际上是一个长度,而不是一个结束索引。
  3. 字符串在 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":是字符串中列表中的最后一个条目,但它应该处理其中的所有其他位置。

如果您的字符串变得更复杂,您可以尝试使用正则表达式来执行搜索。

于 2012-06-29T15:55:31.667 回答
3

正如 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);
于 2012-06-29T16:02:51.140 回答
2

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

于 2012-06-29T15:56:14.537 回答
0

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

于 2012-06-29T15:55:12.643 回答