使用Linq或c#来解析Json

本文关键字:Json Linq 使用 | 更新日期: 2023-09-27 18:16:06

我正在熟悉c#和Linq,感谢您的帮助。对于使用它的人来说应该很容易。我有一个返回联系人信息的Json对象。我也有一个id列表。我需要将列表与Json对象进行比较,无论列表中的值与Json对象中的userclientcode匹配,我都需要提取以下信息(仅用于匹配):

clienttaxonomy (if not empty)
fullname       (if not empty)
[0]contactdata ( -> email if not null or empty)
[1]contactdata (-> address if not null or empty)
[2]contactdata (-> phone number if not null or empty)
第一个列表

    var fileContactIds = new List<string> { "5678765", "2135123", "12341234", "341234123", "12341234123", "2341234123", "341234123", "123412341", "13342354",
"12342341", "123412322", "163341234", "2345234115", "8967896", "75626234 }; 
返回JSON对象:
return  JsonConvert.DeserializeObject<RelatedContacts>(json)?.list;

这是Json对象:[![Json对象][1]][1]

这是Json字符串(未转义):

{
    "type": "com.kurtosys.api.userprofile.domain.RelatedContactList",
    "list": [{
        "objectlistid": 5678765,
        "objectlisttypeid": 4567876,
        "objectlistname": "ALL.National",
        "clienttaxonomyid": 765677,
        "clienttaxonomy": "National Wholesaler",
        "order": 1,
        "contacts": [{
            "personid": 7654345678,
            "fullname": "Person Jallo",
            "userid": 876567,
            "userclientcode": "341234123",
            "contactdetails": [{
                "contactid": 8765567,
                "contacttypeid": 4565,
                "contactdata": "person.contact@site.com"
            }, {
                "contactid": 876545678,
                "contacttypeid": 4565,
                "contactdata": "Baltimore,MD,21209,United States"
            }, {
                "contactid": 87654567,
                "contacttypeid": 4584,
                "contactdata": "410-413-2640"
            }]
        }]
    }, {
        "objectlistid": 765678,
        "objectlisttypeid": 40400461,
        "objectlistname": "RM.Internal",
        "clienttaxonomyid": 7567898,
        "clienttaxonomy": "Internal Regional Wholesaler",
        "order": 2,
        "contacts": [{
            "personid": 56789876,
            "fullname": "Jackson Man",
            "userid": 876567,
            "userclientcode": "1012275",
            "contactdetails": [{
                "contactid": 309598309,
                "contacttypeid": 76546,
                "contactdata": "mister.jackson@@site.com.com"
            }, {
                "contactid": 876567,
                "contacttypeid": 4581,
                "contactdata": "Baltimore,MD,21209,United States"
            }, {
                "contactid": 876567,
                "contacttypeid": 2342,
                "contactdata": "123-413-2604"
            }]
        }]
    }, {
        "objectlistid": 309571364,
        "objectlisttypeid": 40400461,
        "objectlistname": "RM.External",
        "clienttaxonomyid": 309580710,
        "clienttaxonomy": "External Regional Wholesaler",
        "order": 3,
        "contacts": [{
            "personid": 302736188,
            "fullname": "Phal Sumi",
            "userid": 303826019,
            "userclientcode": "163341234",
            "contactdetails": [{
                "contactid": 309598253,
                "contacttypeid": 2342,
                "contactdata": "misters.emailas@site.com"
            }, {
                "contactid": 309611930,
                "contacttypeid": 2342,
                "contactdata": "Baltimore,MD,21209,United States"
            }, {
                "contactid": 34234132,
                "contacttypeid": 3422,
                "contactdata": "342-803-1793"
            }]
        }]
    }]
}

我如何选择使用Linq和Lambdas,并从反序列化对象中放入一个列表,全名,电子邮件,地址等?2]与第一个列表比较,只传输那些userclientcode ==列表a中的数字的项目。

I have try:

var query5 = relatedContact.Where(s => s.objectlistid == Convert.ToInt64(contacts.Select(t => t.id)))
            var selected = relatedContact.Where(p => p.contacts
                .Any(a => fileContactIds.Contains(p.contacts))
                .ToList();
var query2 = relatedContact.Where(s => s.objectlistid == Convert.ToInt64(contacts.Select(t => t.id)))
               .Select(s => new
               {
                   Description = s.clienttaxonomy,
                   Fullname = s.contacts[0].fullname,
                   Email = s.contacts[0].contactdetails[0].contactdata,
                   Address = s.contacts[0].contactdetails[1].contactdata,
                   PhoneNumber = s.contacts[0].contactdetails[2].contactdata
               });

但我真的不知道我在做什么。关于如何获得所需的部分有什么建议吗?我认为部分原因是contactdata是一个列表。谢谢所有的

使用Linq或c#来解析Json

您可以像这样创建一个类来取消JSON对象的初始化

public class Rootobject
{
    public string type { get; set; }
    public List[] list { get; set; }
}
public class List
{
    public int objectlistid { get; set; }
    public int objectlisttypeid { get; set; }
    public string objectlistname { get; set; }
    public int clienttaxonomyid { get; set; }
    public string clienttaxonomy { get; set; }
    public int order { get; set; }
    public Contact[] contacts { get; set; }
}
public class Contact
{
    public long personid { get; set; }
    public string fullname { get; set; }
    public int userid { get; set; }
    public string userclientcode { get; set; }
    public Contactdetail[] contactdetails { get; set; }
}
public class Contactdetail
{
    public int contactid { get; set; }
    public int contacttypeid { get; set; }
    public string contactdata { get; set; }
}

然后要提取选中的信息我们还可以创建另一个类,如

public class ExtractedInfo
{
    public string ocClientTaxonomy { get; set; }
    public string ocFullName { get; set; }
    public CTDetails ocContactDetails { get; set; }
}
public class CTDetails
{
    public string ocCTAddress { get; set; }
    public string ocCTEmail  { get; set; }
    public string ocCTPhoneNumber  { get; set; }
}

现在我们需要从JSON

中找到所有数据
var fileContactIds = new List<string> { "5678765", "2135123", "12341234", "341234123", "12341234123", "2341234123", "341234123", "123412341", "13342354", "12342341", "123412322", "163341234", "2345234115", "8967896", "75626234" }; 
//Read JSON from txt file. You can do it by your way
string myjson = File.ReadAllText("Some.txt"); 
string ctphno, ctadd, ctemail, cltax, ctfullname;
List<ExtractedInfo> ei = new List<ExtractedInfo>(); 
CTDetails ctdtl = new CTDetails();
ExtractedInfo eiex = new ExtractedInfo();
//Deserialize the JSON string to Object.
Rootobject AllData = JsonConvert.DeserializeObject<Rootobject>(myjson);
//Finding all data in List Class
foreach(List lst in AllData.list) 
{
    cltax = lst.clienttaxonomy; // you can directly put eiex.ocClientTaxonomy = lst.clienttaxonomy;
    foreach(Contact ct in lst.contacts)
    {
        //To check if value in the list matches the objectlistid in the Json object
        if(fileContactIds.Contains(lst.objectlistid.ToString()))
        {
            ctfullname = ct.fullname; // you can directly put eiex.ocFullName = ct.fullname;
            foreach(Contactdetail ctd in ct.contactdetails)
            {
                //Here we are trying to find the Match for Email. 
                if(Regex.IsMatch(ctd.contactdata, @"'A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:'.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?'.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)'Z", RegexOptions.IgnoreCase))
                {
                    ctemail = ctd.contactdata;
                    ctdtl.ocCTEmail = ctemail;
                }
                //Here We trying to find the match for Phone Number.
                else if(Regex.IsMatch(ctd.contactdata, @"'(?'d{3}')?-? *'d{3}-? *-?'d{4}", RegexOptions.IgnoreCase))
                {
                    ctphno = ctd.contactdata;
                    ctdtl.ocCTPhoneNumber = ctphno;
                }
                //If NOthing matches than it might be address (Assumed)
                else
                {
                    ctadd = ctd.contactdata;
                    ctdtl.ocCTAddress = ctadd;
                }
            }
            eiex.ocFullName = ctfullname;
        }
    }
    eiex.ocClientTaxonomy = cltax;
    eiex.ocContactDetails = ctdtl;
    ei.Add(eiex);
}