0

我的 C# 模型中有一个字符串,其中填充了这个字符串:

"[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\" http://partner.com/deeplink/to/229547 \"},{\ "ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\" http://partner.com/deeplink/to/id34234 \"}]"

有没有一种方法,使用 LINQ 或 RegEx,我可以解析出 partner_id's - 所以我最终得到了一个列表对象:

229547
id34234

谢谢你的帮助,马克

4

4 回答 4

2

我从来没有使用过任何 JSON 解析器,但如果涉及到 Regex,你可以尝试这样的事情:

private static void regexString()
{
    string myString = "[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\"http://partner.com/deeplink/to/229547\"},{\"ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\"http://partner.com/deeplink/to/id34234\"}]";

    string[] stringList = Regex.Split(myString, "},{");

    for (int i=0; i<stringList.Length ;i++)
    {
        stringList[i] = Regex.Split(Regex.Split(stringList[i], "partner_id\\\":\\\"")[1], "\\\",\\\"partner_url\\\"")[0];
    }
}

还有一个不错的网站可以帮助您将来创建自己的正则表达式模式,请查看:

gskinner.com

还有一个不错的简短教程:

www.codeproject.com

于 2013-11-05T12:47:06.623 回答
2

如果这是字符串的一般格式,那么这个正则表达式应该可以工作

(?i)(?<=(partner_id).{5})\w+

在这里测试

这从你的字符串将得到

229547 and id34234

(?i)= 不区分大小写

(?<=(partner_id).{5})= parter_id的正向后视,然后是任何 5 个字符,在这种情况下将是\":\"

\w+= 任何字母数字字符一次或多次

希望这有帮助

于 2013-11-05T12:52:52.457 回答
2

假设您的链接始终具有合作伙伴 ID-

   string Name = "[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\"http://partner.com/deeplink/to/229547\"},{\"ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\"http://partner.com/deeplink/to/id34234\"}]";

        string[] splittedString = Regex.Split(Name, "}");
        List<string> allIds = new List<string>();
        foreach (var i in splittedString)
        { 
            var ids =Regex.Split(i, "/");
            string id = ids[ids.Length - 1];
            allIds.Add(id);
        }
于 2013-11-05T12:33:51.117 回答
0

由于这是 JSON,您可能不应该费心尝试让正则表达式工作。相反,您可以解析 JSON,然后使用 LINQ。

using System.Web.Script.Serialization; // (in System.Web.Extensions.dll)

...

string s = "[{\"ta_id\":97497,\"partner_id\":\"229547\",\"partner_url\":\"http://partner.com/deeplink/to/229547\"},{\"ta_id\":97832,\"partner_id\":\"id34234\",\"partner_url\":\"http://partner.com/deeplink/to/id34234\"}]";
JavaScriptSerializer j = new JavaScriptSerializer();
object[] objects = (object[])j.DeserializeObject(s);
string[] ids = objects.Cast<Dictionary<string, object>>()
                      .Select(dict => (string)dict["partner_id"])
                      .ToArray();

将其反序列化为对象有点麻烦,因为您没有任何类型信息。如果你不怕创建一个小类来反序列化,你可以这样做:

class Foo
{
    public string partner_id
    {
        get;
        set;
    }
}

...

JavaScriptSerializer j = new JavaScriptSerializer();
string[] ids = j.Deserialize<Foo[]>(s).Select(x => x.partner_id).ToArray();

请注意,还有其他用于反序列化 JSON 的选项。我只是选择了内置的最通用的一个。

于 2013-11-05T13:00:32.480 回答