2016-11-02 1 views
-1

저는 C# 및 Linq에 익숙해지고 있으며 어떤 도움을 주셔서 감사합니다. 그것으로 일하는 사람은 쉽게해야합니다. 연락처 정보를 반환하는 Json 객체가 있습니다. 나는 또한 ID 목록을 가지고있다. 내가 JSON 객체와에 목록을 비교해야 목록의 값은 JSON 객체의 userclientcode 일치하는 곳마다, 나는 (단지 경기에 대한) 다음과 같은 정보를 추출해야합니다Linq 또는 C#을 사용하여 Json을 구문 분석하십시오.

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]

01,235,

이있는 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": "[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": "[email protected]@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" 
      }] 
     }] 
    }] 
} 

사용 방법 1] Linq에와 람다를 사용하여 선택하고 직렬화 된 객체에서 목록의 전체 이름, 이메일, 주소 등을 넣어? 2] 첫 번째 목록과 비교 만 userclientcode가 == 목록 A의 번호가

내가 시도 해당 항목 전송 :

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가 목록이라고 생각합니다. 감사합니다 그런 다음이

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

과 같은 JSON 개체의 desearlization에 대한 클래스를 생성 할 수 있습니다

+1

Newtonsoft.Json 라이브러리는 객체에 json을 비 직렬화하는 데 도움이됩니다. NuGet에서로드 할 수 있습니다. – Fabio

+2

[C#으로 JSON을 어떻게 파싱 할 수 있습니까?] (http://stackoverflow.com/questions/6620165/how- can-i-parse-json-with-c) – SeM

+0

[문자열 및 기타 long 인 linq 및 lambda를 사용하여 두 목록 비교] (http://stackoverflow.com/questions/40400405/compare-two-lists) -with-linq-and-lambda-where-one-is-string-and-other-long) –

답변

1

모두 우리가 또한 지금

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

이 도움이되어 귀하의 요구 사항에 부합되기를 바랍니다.

+0

위대한 설명. –

+0

안내 주셔서 감사합니다. 그러나 Deserializing에 대한 설명은 Json 객체의 objectListId 목록과 값을 비교하는 것이 아닙니다. 참고 : 목록을 Json 개체와 비교해야하며 목록의 값이 Json 개체의 objectlistid와 일치하는 경우 다음 정보를 추출해야합니다 (일치하는 항목 만 해당). –

+0

죄송합니다. @AfshinGhazi 귀하의 질문을 읽지 않습니다. 정확히. 귀하의 필요에 맞게 솔루션을 사용자 정의하려고합니다. –

관련 문제