Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
171 views
in Technique[技术] by (71.8m points)

Use Linq or C# to parse Json

I am getting familiar with C# and Linq and appreciate any help. It should be easy for someone who works with it. I have a Json object that returns contact information. I also have a list of ids. I need to compare the list to the Json object and wherever the value in the list matches the userclientcode in the Json object, I need to extract the following information (only for the matches):

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)

First List

    var fileContactIds = new List<string> { "5678765", "2135123", "12341234", "341234123", "12341234123", "2341234123", "341234123", "123412341", "13342354",
"12342341", "123412322", "163341234", "2345234115", "8967896", "75626234 }; 

JSON object returned with:

return  JsonConvert.DeserializeObject<RelatedContacts>(json)?.list;

This is the Json object: [![Json object][1]][1]

This is the Json string (unescaped):

{
    "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": "[email protected]"
            }, {
                "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": "[email protected]"
            }, {
                "contactid": 309611930,
                "contacttypeid": 2342,
                "contactdata": "Baltimore,MD,21209,United States"
            }, {
                "contactid": 34234132,
                "contacttypeid": 3422,
                "contactdata": "342-803-1793"
            }]
        }]
    }]
}

How do I 1] Select using Linq and Lambdas and put in a list fullname, email, address etc from the deserialized object ? 2]compare with first list and only transfer those items where the userclientcode == the number in list A.

I have tried:

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

               });

But don't really know what I'm doing it seems. Any suggestions on how to get the required sections ? I think part of the reason is that the contactdata is a list. Thanks all

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can create a classes for the desearlization of JSON Object like this

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; }
}

And then to extract the selected information we can also create a another class like

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; }
}

Now we have to find all the data from 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])?)", 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);
}

Hope this helps and fit in your requirements.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...