C# 子字符串继续搜索,直到指定字符

C# 子字符串继续搜索,直到指定字符,c#,.net,string,linq,substring,C#,.net,String,Linq,Substring,我在运行时得到一个字符串。字符串为JSON格式(键值对)。其中一个键是“userId”。我需要检索userId的值。问题是我不知道“userId”键的位置。字符串可以像{“name”:“XX”,“userId”:“YYY”,“age”:“10”}或者它可以像{“age”:“10”,“name”:“XX”,“userId”:“YYY”}或者它可以像这样{“age”:“10”} 我正在考虑使用substring() 我不确定,在找到下一个之前,如何说继续“(双引号)您可以这样做: var needl

我在运行时得到一个字符串。字符串为JSON格式(键值对)。其中一个键是“
userId
”。我需要检索
userId
的值。问题是我不知道“
userId
”键的位置。字符串可以像
{“name”:“XX”,“userId”:“YYY”,“age”:“10”}
或者它可以像
{“age”:“10”,“name”:“XX”,“userId”:“YYY”}
或者它可以像这样
{“age”:“10”}

我正在考虑使用
substring()

我不确定,在找到下一个
之前,如何说继续“
(双引号)

您可以这样做:

var needle = "\"userId\":"; // also you forgot to escape the quote here
var index = myString.IndexOf(needle); 
if(index != -1){
  var afterTheUserId = myString.Substring(index + needle.Length);
  var quoteIndex = afterTheUserId.IndexOf('"');
  // do what you want with quoteIndex
}

但正如Eric Philips和PhonicUK所说,您应该使用适当的JSON解析器,而不是编写自己的字符串函数。

如果只计划使用
userId
属性,您只需使用
userId
成员声明一个对象并反序列化JSON。反序列化过程中将忽略任何其他属性

class UserIDObj
{
   public string UserId { get; set; }
}

var obj = JsonConvert.DeserializeObject<UserIDObj>("{\"name\":\"XX\", \"userId\":\"YYY\",\"age\":\"10\"}");
string usrID = obj.UserId;
类UserIDObj { 公共字符串用户标识{get;set;} } var obj=JsonConvert.DeserializeObject(“{\'name\':\'XX\',\'userId\':\'YYY\',\'age\':\'10\'”); 字符串usrID=obj.UserId;
由@Wiktor Stribiżew给出的答案也很有效。我正在粘贴他的解决方案


System.Text.RegularExpressions.Regex.Match(myString,“\”userId\“:\”([^\“]+)”)组[1].Value

为什么不反序列化JSON而不是重新发明轮子?使用合适的JSON解析器并实际读取数据。不要尝试自己用字符串函数来解析它。@ErikPhilips:我想取消JSON的序列化,但字符串的格式是不固定的。我同意其他评论,尝试这样做是荒谬的自己编写一个简化的JSON解析器。只需正确地编写并使用现有的工具。也就是说,您发布的一小段代码表明您知道使用
string.IndexOf()
方法查找文本
“userId:”
。如果您知道这一点,为什么不知道使用?@PeterDuniho:谢谢。我明白你的意思。我不能使用
myString.Substring(index+pine.Length)。正如我所说,我不确定JSON输入。键的顺序和键的名称不是固定的。为什么不能使用
myString.Substring(index+pine.Length)?@OpenStack:JSON不要求键/值对以任何特定顺序排列。我不明白为什么我的答案被否决,我的意思是我同意这显然不是解析OP的JSON代码的好方法,但我正在回答这个问题。
class UserIDObj
{
   public string UserId { get; set; }
}

var obj = JsonConvert.DeserializeObject<UserIDObj>("{\"name\":\"XX\", \"userId\":\"YYY\",\"age\":\"10\"}");
string usrID = obj.UserId;