-1

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": "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"
            }]
        }]
    }]
}

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

Afshin Ghazi
  • 2,784
  • 4
  • 23
  • 37
  • 1
    Newtonsoft.Json library will help to deserialize json to objects, you can load it from NuGet – Fabio Nov 02 '16 at 08:23
  • 2
    Possible duplicate of [How can I parse JSON with C#?](http://stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c) – SᴇM Nov 02 '16 at 08:25
  • Possible duplicate of [Compare two lists with linq and lambda where one is string and other long](http://stackoverflow.com/questions/40400405/compare-two-lists-with-linq-and-lambda-where-one-is-string-and-other-long) – Afshin Ghazi Nov 03 '16 at 13:29

1 Answers1

1

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])?)\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);
}

Hope this helps and fit in your requirements.

Mohit S
  • 13,723
  • 6
  • 34
  • 69
  • Great explanation. –  Nov 02 '16 at 09:42
  • Thanks for the guidance. Your explanation is however about Deserializing not about comparing the values with the list of objectListId from the Json object. NOTE: I need to compare the list to the Json object and wherever the value in the list matches the objectlistid in the Json object, I need to extract the following information (only for the matches): – Afshin Ghazi Nov 02 '16 at 11:43
  • Sorry @AfshinGhazi I havent read your question properly. I am trying to customize the solution for your need. – Mohit S Nov 03 '16 at 01:58
  • Hi @AfshinGhazi if this or any answer has solved your question please consider [accepting it](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) by clicking the check-mark. This indicates to the wider community that you've found a solution and gives some reputation to both the answerer and yourself. There is no obligation to do this. – Mohit S Nov 04 '16 at 08:11