2016-04-07 19 views
0

dizisinde eksiktir. Üçüncü döngüye geldiğimde, tablodaki "Satır" ı bulamadığı için havaya uçar. Niye ya?Newtonsoft.JSON ile dinamik JSON ayrıştırma, seri hale getirilmiş nesne

var converter = new ExpandoObjectConverter(); 
dynamic deserializeObject = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter); 

foreach (var model in deserializeObject.Model) 
{ 
    foreach (var table in model.Table) 
    { 
     foreach (var row in table.Row) 
     { 
      Console.WriteLine(row.BookId + ": " + row.BookName); 
     } 
    } 
} 

JSON:

{ 
    "Model": [ 
    { 
     "Field1": "Field1Value", 
     "Field2": "Field2Value", 
     "Field3": "Field3Value", 
     "Table": { 
     "Row": [ 
      { 
      "BookId": "1", 
      "BookName": "Computer Architecture", 
      "Category": "Computers", 
      "Price": "125.60" 
      }, 
      { 
      "BookId": "2", 
      "BookName": "Asp.Net 4 Blue Book", 
      "Category": "Programming", 
      "Price": "56.00" 
      }, 
      { 
      "BookId": "3", 
      "BookName": "Popular Science", 
      "Category": "Science", 
      "Price": "210.40" 
      }, 
      { 
      "BookId": "4", 
      "BookName": "Mission Impossible", 
      "Category": "Adventure", 
      "Price": "210.40" 
      } 
     ] 
     } 
    }, 
    { 
     "ClientFirstName": "Jane", 
     "ClientLastName": "Doe", 
     "Table": [ 
     { 
      "Row": [ 
      { 
       "BookId": "1", 
       "BookName": "Computer Architecture", 
       "Category": "Computers", 
       "Price": "125.60" 
      }, 
      { 
       "BookId": "3", 
       "BookName": "Popular Science", 
       "Category": "Science", 
       "Price": "210.40" 
      }, 
      { 
       "BookId": "4", 
       "BookName": "Mission Impossible", 
       "Category": "Adventure", 
       "Price": "210.40" 
      } 
      ] 
     }, 
     { 
      "Row": [ 
      { 
       "BookId": "1", 
       "BookName": "Computer Architecture", 
       "Category": "Computers", 
       "Price": "125.60" 
      }, 
      { 
       "BookId": "4", 
       "BookName": "Mission Impossible", 
       "Category": "Adventure", 
       "Price": "210.40" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 
+0

http://jsonlint.com/ – tofutim

+0

da json kontrol Kod yeniden biçimlendirildi – Thomas

cevap

1

Table mülkiyet bir durumda ve başka nesne olarak dizi olarak biçimlendirilmiştir. Eski, List<object> ürününe serpiştirilirken, ikincisi KeyValuePair<string, object> ürününe seri dönüş yapar.

Geçerli örneğinde Table tip KeyValuePair<string, object> ait olup olmadığını kontrol edin ve sonra buna göre devam edebilirsiniz:

foreach (var model in deserializeObject.Model) 
{ 
    foreach (var table in model.Table) 
    { 
     if(table is KeyValuePair<string, object>) 
     { 
      foreach (var row in table.Value) 
      { 
       Console.WriteLine(row.BookId + ": " + row.BookName); 
      } 
     } 
     else 
     { 
      foreach (var row in table.Row) 
      { 
       Console.WriteLine(row.BookId + ": " + row.BookName); 
      } 
     } 
    } 
} 

dotnetfiddle demo

2

sorun nesneyi deserializing ediyoruz yolu ile değil. Jsonunuz, bir tablo içeren iki nesne arasında farklıdır.

birinci nesne satırlar dizisi olan bir tablodur:

"Table": { 
    "Row": [ 
     { 
     "BookId": "1", 
     "BookName": "Computer Architecture", 
     "Category": "Computers", 
     "Price": "125.60" 
     }, 
     { 
     "BookId": "2", 
     "BookName": "Asp.Net 4 Blue Book", 
     "Category": "Programming", 
     "Price": "56.00" 
     }, 
     { 
     "BookId": "3", 
     "BookName": "Popular Science", 
     "Category": "Science", 
     "Price": "210.40" 
     }, 
     { 
     "BookId": "4", 
     "BookName": "Mission Impossible", 
     "Category": "Adventure", 
     "Price": "210.40" 
     } 
    ] 
    } 
} 

Ve ikinci istemci nesne bir dizinin bir dizi vardır. Ayrıca, bu istemci nesnesinde tablo dizisinin dışında ikinci bir satır diziniz var.

 "Table": [ 
    { 
     "Row": [ 
     { 
      "BookId": "1", 
      "BookName": "Computer Architecture", 
      "Category": "Computers", 
      "Price": "125.60" 
     }, 
     { 
      "BookId": "3", 
      "BookName": "Popular Science", 
      "Category": "Science", 
      "Price": "210.40" 
     }, 
     { 
      "BookId": "4", 
      "BookName": "Mission Impossible", 
      "Category": "Adventure", 
      "Price": "210.40" 
     } 
     ] 
    }, 
    { 
     "Row": [ 
     { 
      "BookId": "1", 
      "BookName": "Computer Architecture", 
      "Category": "Computers", 
      "Price": "125.60" 
     }, 
     { 
      "BookId": "4", 
      "BookName": "Mission Impossible", 
      "Category": "Adventure", 
      "Price": "210.40" 
     } 
     ] 
    } 

Ben farklı şekilde json biçimlendirme veya tablolar iki tür o json sahip olsa döngü için farklı bir yöntem oluşturarak ya öneriyoruz. Biri bir nesne, diğeri ise bir dizi. Örneğin,

. Dinamikinizi Newtonsoft.Json.Linq'de bulunan bir Newtonsoft Jobject olarak değiştirdim. Bu, her ikisi de, biri nesne, ikincisi ise bir dizi olmak üzere iki tablodan alacaktır. senin JSON

 var converter = new ExpandoObjectConverter(); 
     var deserializeObject = JsonConvert.DeserializeObject<JObject>(jsonString, converter); 

     foreach(var v in deserializeObject["Model"]) 
     { 
      if(v["Table"] != null && v["Table"].Type == JTokenType.Object) 
      { 
       foreach (var x in v["Table"]["Row"]) 
       { 
        Console.Write(x["BookId"] + " : " + x["BookName"] + Environment.NewLine); 
       } 
      } 
      else if (v["Table"].Type == JTokenType.Array) 
      { 
       foreach(var subTable in v["Table"]) 
       { 
        foreach (var row in subTable["Row"]) 
        { 
         Console.Write(row["BookId"] + " : " + row["BookName"] + Environment.NewLine); 
        } 
       } 

      }    
     }