2016-11-02 7 views
-1

私はC#とLinqについてよく知っており、助けてくれてありがとうございます。それを扱う人にとっては簡単なことです。私は連絡先情報を返すJsonオブジェクトを持っています。私はidsのリストも持っています。私は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オブジェクトである: [1]

[[JSONオブジェクト] [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": "[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がリストであると思う。 おかげで、すべての

+1

Newtonsoft.Jsonライブラリはjsonをオブジェクトに逆シリアル化するのに役立ちます。NuGetから読み込むことができます – Fabio

+2

[C#でJSONをどのように解析できますか?](http://stackoverflow.com/questions/6620165/how- can-i-parse-json-with-c) – SeM

+0

[linqとlambdaで2つのリストを比較すると、1つが文字列で、もう1つはlongです](http://stackoverflow.com/questions/40400405/compare-two-lists) -with-linq-and-lambda-where-one-is-string-and-other-long) –

答えて

1

あなたはこの

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のためのクラスを作成することができます。そして、我々はまた、今

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私はあなたの質問を読んでいません。正しく。あなたのニーズに合わせてソリューションをカスタマイズしようとしています。 –

関連する問題