2013-11-06 3 views
1

Может ли кто-нибудь помочь написать Newtonsoft JSON Deserializer для моего формата JSON.Newtonsoft JSON Deserialize Необходимая помощь

У меня есть следующий формат json.

{ 
    "success": true, 
    "message": "Missing ajax operation. Please contact administrator.", 
    "data": { 
     "mode": "new", 
     "data": { 
      "1": { 
       "CustomerCode": "CUST00001", 
       "Name": "Dell Asia Pacific Sdn. Bhd.", 
       "Add1": "Plot 76 Mukim 11, Bukit Tengah Industrial Park; Bukit Mertajam; Pulau Pinang; 14000", 
       "Add2": "", 
       "Add3": "", 
       "Daddr1": "Level 21, Suite 21.01, The Gardens South Tower, Mid Valley City, Lingkaran Syed Putra, ; Kuala Lumpur; Wilayah Persekutuan; 59200", 
       "Daddr2": "", 
       "Daddr3": "", 
       "Attn": "", 
       "Phone": "", 
       "PhoneA": "", 
       "Fax": "", 
       "Area": "", 
       "Agent": "", 
       "Email": "", 
       "CurrCode": "MYR", 
       "Business": "", 
       "Term": "30 Days" 
      }, 
      "2": { 
       "CustomerCode": "CUST00002", 
       "Name": "Intel Technology Sdn Bhd", 
       "Add1": "Bayan Lepas Free Industrial Zone,Phase 3,Halaman Kampung Jawa; Bayan Lepas; Pulau Pinang; 11900", 
       "Add2": "", 
       "Add3": "", 
       "Daddr1": "1st Flr,Standard Chartered Bank Chambers,Lebuh Pantai;Penang; Kuala Lumpur; Wilayah Persekutuan; 10300", 
       "Daddr2": "", 
       "Daddr3": "", 
       "Attn": "", 
       "Phone": "", 
       "PhoneA": "", 
       "Fax": "", 
       "Area": "", 
       "Agent": "", 
       "Email": "", 
       "CurrCode": "MYR", 
       "Business": "", 
       "Term": "30 Days" 
      }, 
      "3": { 
       "CustomerCode": "CUST00003", 
       "Name": "Petronas Carigali Sdn. Bhd.", 
       "Add1": "Tower 1, Petronas Twin Towers,Kuala Lumpur City Centre,; Kuala Lumpur; Wilayah Persekutuan; 50088", 
       "Add2": "", 
       "Add3": "", 
       "Daddr1": "Tower 1,Petronas Twin Towers,K.L.City Centre; Kuala Lumpur; Wilayah Persekutuan; 50088", 
       "Daddr2": "", 
       "Daddr3": "", 
       "Attn": "", 
       "Phone": "", 
       "PhoneA": "", 
       "Fax": "", 
       "Area": "", 
       "Agent": "", 
       "Email": "", 
       "CurrCode": "MYR", 
       "Business": "", 
       "Term": "30 Days" 
      } 
     } 
    } 
} 

и я следующая структура классов

public class CustomerInfo 
     { 
      public string CustomerCode { get; set; } 
      public string Name { get; set; } 
      public string Add1 { get; set; } 
      public string Add2 { get; set; } 
      public string Add3 { get; set; } 
      public string Daddr1 { get; set; } 
      public string Daddr2 { get; set; } 
      public string Daddr3 { get; set; } 
      public string Attn { get; set; } 
      public string Phone { get; set; } 
      public string PhoneA { get; set; } 
      public string Fax { get; set; } 
      public string Area { get; set; } 
      public string Agent { get; set; } 
      public string Email { get; set; } 
      public string CurrCode { get; set; } 
      public string Business { get; set; } 
      public string Term { get; set; } 
     } 

     public class CustomerData 
     { 
      public CustomerInfo customerInfo { get; set; } 
     } 

     public class Data 
     { 
      public string mode { get; set; } 
      public CustomerData custdata { get; set; } 
     } 

     public class CustomerRootObject 
     { 
      public bool success { get; set; } 
      public string message { get; set; } 
      public Data data { get; set; } 
     } 
    } 

У меня есть трудности разобрать этот формат JSON я написал следующее, но он не работает какой-либо помощи высоко ценится.

List<CustomerRootObject> customerlist = JsonConvert.DeserializeObject<List<CustomerRootObject>> (json); 

foreach (var info in customerlist) {Console.WriteLine(info.data.custdata.CustomerCode);} 
+1

Каким образом это не работает? Вы получаете сообщение об ошибке? – Tobberoth

+0

Я не получаю проблему синтаксического анализа, но foreach не вызван. – user2479042

+1

Вы должны, вероятно, отладить его и посмотреть, что происходит. Вопрос: почему вы десериализуете «List » вместо «CustomerRootObject»? – Tobberoth

ответ

0

Похоже, что ваш JSON сформирован неправильно (или у вас класс не имеет правильной структуры). Какой из них можно изменить?

Во-первых, как и @Tobberoth, вы не должны десериализоваться в списке.

CustomerRootObject customer = JsonConvert.DeserializeObject<CustomerRootObject> (json) 

Вы «список» данных не на уровне CustomerRootObject - это на уровне CustomerInfo.

public class CustomerData 
    { 
     public List<CustomerInfo> customerInfo { get; set; } 
    } 

Во-вторых, вы должны изменить этот класс:

public class Data 
    { 
     public CustomerData data { get; set; } 
    } 

Ваша собственность JSON называется данных. Вам нужно изменить одно или другое.

+1

Список здесь не работает - в JSON нет массива. –

+1

Также нет необходимости изменять имя свойства JSON или имя класса. Как указано в ответе Брайана Роджерса, вы можете просто украсить атрибут класса с помощью [JsonProperty («data»)] – Shiva

4

Это не работает, потому что ваша структура классов не соответствует JSON.

Попробуйте изменить Data класс к этому:

public class Data 
{ 
    public string mode { get; set; } 
    [JsonProperty("data")] 
    public Dictionary<int, CustomerInfo> customers { get; set; } 
} 

Тогда десериализации так:

CustomerRootObject obj = JsonConvert.DeserializeObject<CustomerRootObject>(json); 

Вы можете перечислить клиентов, как это:

foreach (KeyValuePair<int, CustomerInfo> kvp in obj.data.customers) 
{ 
    Console.WriteLine("----- Customer " + kvp.Key + " -----"); 
    Console.WriteLine("CustomerCode: " + kvp.Value.CustomerCode); 
    Console.WriteLine("Name: " + kvp.Value.Name); 
    Console.WriteLine("Add1: " + kvp.Value.Add1.Replace(";", "\r\n")); 
} 

Полный демо :

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @" 
     { 
      ""success"": true, 
      ""message"": ""Missing ajax operation. Please contact administrator."", 
      ""data"": { 
       ""mode"": ""new"", 
       ""data"": { 
        ""1"": { 
         ""CustomerCode"": ""CUST00001"", 
         ""Name"": ""Dell Asia Pacific Sdn. Bhd."", 
         ""Add1"": ""Plot 76 Mukim 11, Bukit Tengah Industrial Park; Bukit Mertajam; Pulau Pinang; 14000"", 
         ""Add2"": """", 
         ""Add3"": """", 
         ""Daddr1"": ""Level 21, Suite 21.01, The Gardens South Tower, Mid Valley City, Lingkaran Syed Putra, ; Kuala Lumpur; Wilayah Persekutuan; 59200"", 
         ""Daddr2"": """", 
         ""Daddr3"": """", 
         ""Attn"": """", 
         ""Phone"": """", 
         ""PhoneA"": """", 
         ""Fax"": """", 
         ""Area"": """", 
         ""Agent"": """", 
         ""Email"": """", 
         ""CurrCode"": ""MYR"", 
         ""Business"": """", 
         ""Term"": ""30 Days"" 
        }, 
        ""2"": { 
         ""CustomerCode"": ""CUST00002"", 
         ""Name"": ""Intel Technology Sdn Bhd"", 
         ""Add1"": ""Bayan Lepas Free Industrial Zone,Phase 3,Halaman Kampung Jawa; Bayan Lepas; Pulau Pinang; 11900"", 
         ""Add2"": """", 
         ""Add3"": """", 
         ""Daddr1"": ""1st Flr,Standard Chartered Bank Chambers,Lebuh Pantai;Penang; Kuala Lumpur; Wilayah Persekutuan; 10300"", 
         ""Daddr2"": """", 
         ""Daddr3"": """", 
         ""Attn"": """", 
         ""Phone"": """", 
         ""PhoneA"": """", 
         ""Fax"": """", 
         ""Area"": """", 
         ""Agent"": """", 
         ""Email"": """", 
         ""CurrCode"": ""MYR"", 
         ""Business"": """", 
         ""Term"": ""30 Days"" 
        }, 
        ""3"": { 
         ""CustomerCode"": ""CUST00003"", 
         ""Name"": ""Petronas Carigali Sdn. Bhd."", 
         ""Add1"": ""Tower 1, Petronas Twin Towers,Kuala Lumpur City Centre,; Kuala Lumpur; Wilayah Persekutuan; 50088"", 
         ""Add2"": """", 
         ""Add3"": """", 
         ""Daddr1"": ""Tower 1,Petronas Twin Towers,K.L.City Centre; Kuala Lumpur; Wilayah Persekutuan; 50088"", 
         ""Daddr2"": """", 
         ""Daddr3"": """", 
         ""Attn"": """", 
         ""Phone"": """", 
         ""PhoneA"": """", 
         ""Fax"": """", 
         ""Area"": """", 
         ""Agent"": """", 
         ""Email"": """", 
         ""CurrCode"": ""MYR"", 
         ""Business"": """", 
         ""Term"": ""30 Days"" 
        } 
       } 
      } 
     }"; 

     CustomerRootObject obj = JsonConvert.DeserializeObject<CustomerRootObject>(json); 

     foreach (KeyValuePair<int, CustomerInfo> kvp in obj.data.customers) 
     { 
      Console.WriteLine("----- Customer " + kvp.Key + " -----"); 
      Console.WriteLine("CustomerCode: " + kvp.Value.CustomerCode); 
      Console.WriteLine("Name: " + kvp.Value.Name); 
      Console.WriteLine("Add1: " + kvp.Value.Add1.Replace(";", "\r\n")); 
     } 
     Console.WriteLine("\nPress a key to Exit..."); 
     Console.ReadKey(); 

    } 

    public class CustomerInfo 
    { 
     public string CustomerCode { get; set; } 
     public string Name { get; set; } 
     public string Add1 { get; set; } 
     public string Add2 { get; set; } 
     public string Add3 { get; set; } 
     public string Daddr1 { get; set; } 
     public string Daddr2 { get; set; } 
     public string Daddr3 { get; set; } 
     public string Attn { get; set; } 
     public string Phone { get; set; } 
     public string PhoneA { get; set; } 
     public string Fax { get; set; } 
     public string Area { get; set; } 
     public string Agent { get; set; } 
     public string Email { get; set; } 
     public string CurrCode { get; set; } 
     public string Business { get; set; } 
     public string Term { get; set; } 
    } 

    public class Data 
    { 
     public string mode { get; set; } 
     [JsonProperty("data")] 
     public Dictionary<int, CustomerInfo> customers { get; set; } 
    } 

    public class CustomerRootObject 
    { 
     public bool success { get; set; } 
     public string message { get; set; } 
     public Data data { get; set; } 
    } 
} 

Выход:

----- Customer 1 ----- 
CustomerCode: CUST00001 
Name: Dell Asia Pacific Sdn. Bhd. 
Add1: Plot 76 Mukim 11, Bukit Tengah Industrial Park 
Bukit Mertajam 
Pulau Pinang 
14000 
----- Customer 2 ----- 
CustomerCode: CUST00002 
Name: Intel Technology Sdn Bhd 
Add1: Bayan Lepas Free Industrial Zone,Phase 3,Halaman Kampung Jawa 
Bayan Lepas 
Pulau Pinang 
11900 
----- Customer 3 ----- 
CustomerCode: CUST00003 
Name: Petronas Carigali Sdn. Bhd. 
Add1: Tower 1, Petronas Twin Towers,Kuala Lumpur City Centre, 
Kuala Lumpur 
Wilayah Persekutuan 
50088 
+0

Большое спасибо Я стараюсь – user2479042

+0

Большое вам спасибо за то, что вы нашли время и помогли мне. Он работает отлично. – user2479042

+0

Без проблем, рад помочь. –

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