提取键值对

时间:2014-03-15 15:33:13

标签: c# .net regex arrays json

我正在研究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"
  }
]

正则表达式的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. 如果我必须获得密钥:值对,那么我还需要做什么?

5 个答案:

答案 0 :(得分:7)

您不必使用regex
您尝试解析的数据格式为JSON

例如,您可以使用Json.NET

解析它
Dictionary<string, dynamic> MyData = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(JsonData);

如果你想要原生支持,试试JavascriptSerializer(它还会给你一个如何直接将它解析成类的例子,这比关于你的JSON数据结构的字典更好)

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

答案 1 :(得分:2)

你正在使用贪婪的正则表达式.*这就是你得到所有的原因。而是使用非贪婪.*?然后分成几部分。

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

之后,如果您需要解析更多,那么在捕获的组(matchgroup)上使用正则表达式:

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

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

答案 2 :(得分:1)

使用regexp进行此类任务是一种不好的做法使用Json.NET库

答案 3 :(得分:1)

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

    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

答案 4 :(得分:0)

您的API以JSON格式返回数据,您应该使用JavaScriptSerializer命名空间下的.NET内置System.Web.Script.Serialization类或Json.NET等第三方库来阅读这个回应。

要使用JavaScriptSerializer,首先您需要使用System.Web.Extensions

添加Add Reference...引用

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