2014-12-23 3 views
0

У меня есть это в формате JSON (данные изменены, чтобы защитить виновных):Split поля при десериализации JSON объект

{"members" : [{"Name":"Mick Jagger","Status":"ACTIVE","ExpireDate":"11/19/2015","TermType":"MONTH","State":"NY","Address2":"","Address1":"123 Anystreet","Type":"PREMIUM","EmailAddress":"[email protected]","Zip":"12345","Country":"US","City":"New York","Term":"12"}, 
{"Name":"Keith Richards","Status":"ACTIVE","ExpireDate":"11/19/2015","TermType":"ANNUAL","State":"CT","Address2":"","Address1":"5150 Main St","Type":"PREMIUM","EmailAddress":"[email protected]","Zip":"45678","Country":"US","City":"New York","Term":"1"}]} 

И у меня есть этот класс:

public class Member 
{ 
    public string Company_Num { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Status { get; set; } 
    public string ExpireDate { get; set; } 
    public string TermType { get; set; } 
    public string State { get; set; } 
    public string Address2 { get; set; } 
    public string Address1 { get; set; } 
    public string Type { get; set; } 
    public string EmailAddress { get; set; } 
    public string Zip { get; set; } 
    public string Country { get; set; } 
    public string City { get; set; } 
    public string Term { get; set; } 
} 

public class MemberList 
{ 
    public List<Member> members { get; set; } 
} 

Когда я десериализации это в наборе данных , он работает красиво. Но ...

Когда я сгенерировал класс MemberList, я забыл, что «имя» в JSON необходимо разделить на FirstName и LastName. Есть ли способ десериализации объекта JSON и разделения «Имя» одновременно? (Так FirstName является «Кит», LastName является «Richards» и так далее.)

Вот как это выглядит, когда я десериализации его участники:

public static MemberList memList() 
    {    
     WebClient atv = new WebClient(); 
     var data = atv.DownloadString("https://www.somewebsvc.com/memberships"); 
     MemberList m = Newtonsoft.Json.JsonConvert.DeserializeObject<MemberList>(data); 
     return m; 
    } 
+0

Как вы будете разделить имена с несколькими словами? Я думаю, вы должны пересмотреть их разделение –

+0

Мы уже остановились на том, как это будет обрабатываться. Я не доволен этим, но так хочет клиент. – Tom

+0

Вы можете создать два поля, и в геттере просто разделите «Имя» так или иначе, как хотите –

ответ

0

Это тот случай, полагая, что это, как только как вы задаете вопрос.

Я добавил свойство Name для членов, а затем добавил цикл foreach до того, как код вернет список. Так что теперь это выглядит следующим образом:

public static MemberList memList() 
{    
    WebClient atv = new WebClient(); 
    var data = atv.DownloadString("https://www.somewebsvc.com/memberships"); 
    MemberList m = Newtonsoft.Json.JsonConvert.DeserializeObject<MemberList>(data); 
    foreach (Member mb in m.members) 
     { 
      string[] names = mb.Name.Split(new char[] { ' ' }, 2); 
      mb.FirstName = names[0]; 
      mb.LastName = names[1]; 
     } 
    return m; 
} 

Как было отмечено в комментариях, это очень некрасиво, когда вы должны разобрать «Мэри Энн Смит» или «Найджел Baxter Тейлор», но вы можете в значительной степени вставить любую строку -параметр логики там, и это сработает. Клиент просто хочет получить первое слово имени для имени. Если это сделает их счастливыми, я не буду спорить.

2

Возможным решением было бы сделать поля в модели, которая будет возвращать нужные значения при получении их:

public class Member 
{ 
    //other properties 
    private string _lastName; 
    public string LastName {get 
    { 
     if (_lastName == null) 
      _lastName = Name.Split(new [] {' '}, 2)[1]; 
     return _lastName; 
    }} 

    private string _firstName; 
    public string FirstName {get 
    { 
     if (_firstName== null) 
      _firstName= Name.Split(new [] {' '}, 2)[0]; 
     return _firstName; 
    }} 
} 
+0

Или аналогичным образом создайте свойство Name, которое на самом деле является интерфейсом для переменных-членов FirstName и LastName. JSON десериализация вызовет его сеттер. – morningstar

Смежные вопросы