提取键值对

本文关键字:键值对 提取 | 更新日期: 2023-09-27 17:50:35

我正在研究Rest api。它工作得很好。当我请求它时,它会给我一个响应。实际上,这个响应是一个由子数组和其中的键值对组成的数组。现在我想在c#中提取这些键:值对。我想到了正则表达式来提取子字符串,但我还不知道正则表达式。但我尝试先得到子数组,如。

输入字符串

[
  {
    "id": "1",
    "name": "kashif",
    "father_name": "mirza",
    "contact": "21321",
    "email": "sdf",
    "image": "sdfsdf"
  },
  {
    "id": "2",
    "name": "Kashif",
    "father_name": "Mirza",
    "contact": "0342809211",
    "email": "shadbagh@wele.com",
    "image": "photo[1].jpg"
  },
  {
    "id": "3",
    "name": "Abdussadiq",
    "father_name": "Abdul Haq Khan",
    "contact": "03449066113",
    "email": "abdus.sadiq04@gmail.com",
    "image": "1393602_698558840157121_1872079026_n.jpg"
  }
]

regex

c#代码
 Match match = Regex.Match(input, @"(?<='{)(.*)(?='})",
        RegexOptions.IgnoreCase);
if (match.Success)
    {
        foreach(var matchgroup in match.Groups)
            Console.WriteLine(matchgroup);
    }

它返回给我结果,但不是根据我的需要。它返回我像

    "id": "1",
    "name": "kashif",
    "father_name": "mirza",
    "contact": "21321",
    "email": "sdf",
    "image": "sdfsdf"
  },
  {
    "id": "2",
    "name": "Kashif",
    "father_name": "Mirza",
    "contact": "0342809211",
    "email": "shadbagh@wele.com",
    "image": "photo[1].jpg"
  },
  {
    "id": "3",
    "name": "Abdussadiq",
    "father_name": "Abdul Haq Khan",
    "contact": "03449066113",
    "email": "abdus.sadiq04@gmail.com",
    "image": "1393602_698558840157121_1872079026_n.jpg"

这意味着它只删除了外括号而不删除内括号

我的问题是:

  1. 我在上面的代码做错了什么?
  2. 如果我必须得到键:值对那么我还需要做什么?

提取键值对

您不必使用regex
您试图解析的数据是JSON格式。

例如,您可以用Json解析它。净
Dictionary<string, dynamic> MyData = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(JsonData);

如果你想要一个本机支持,试试JavascriptSerializer(它也给了你一个如何将它直接解析成类的例子,这比你的JSON数据结构的字典更好)

Dictionary<string, dynamic> MyData = JavaScriptSerializer.Deserialize<Dictionary<string, dynamic>>(JsonData);

你正在使用贪婪的正则表达式.*,这就是为什么你得到所有。相反,使用非贪婪的.*?将其分割成碎片。

Match match = Regex.Match(input, @"(?<='{)(.*?)(?='})", RegexOptions.IgnoreCase);

之后,如果需要解析更多内容,则对捕获的组(matchgroup)使用regex:

(".*?(?<!'')":".*?(?<!'')")    <-- you'll get spoofed here if single quote, or no quotes

但仍然,我总是建议您使用任何json解析库。

对于这种任务使用regexp是一个不好的做法使用Json。网络图书馆

首先你可以创建一个这样的类:

    public class MyClass
    {
       public int Id { get; set; }
       public string Name { get; set; }
       public string Father_Name { get; set; }
       public string Contact { get; set; }
       public string Email { get; set; }
       //Could be byte[]
       public string Image { get; set; }
    }

然后你可以像下面这样使用JavaScriptSerializer类:

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    List<MyClass> myClassCollection = serializer.Deserialize<List<MyClass>>(result);
    //Where result is your json string

您的API返回JSON格式的数据,您应该使用。net在System.Web.Script.Serialization命名空间下的内置JavaScriptSerializer类或第三方库(如Json.NET)来阅读此响应。

要使用JavaScriptSerializer,首先需要使用Add Reference...添加System.Web.Extensions引用

使用Regex解析JSON是一个不好的做法。