2013-12-16 25 views
30

json'u kullanmak için .net web api kullanıyorum ve açılı olarak ön tarafa döndürüyorum. Json, bir nesne veya bir dizi olabilir. Kodum şu anda sadece nesne değil dizi için çalışıyor. İçeriğin bir nesne mi yoksa dizi mi olduğunu belirlemek için bir yol bulmalıyım.Json sonuçlarının nesne mi yoksa dizi mi olduğunu belirleyin

İşte benim kod

public HttpResponseMessage Get(string id) 
    { 
     string singleFilePath = String.Format("{0}/../Data/phones/{1}.json", AssemblyDirectory, id); 
     List<Phone> phones = new List<Phone>(); 
     Phone phone = new Phone(); 
     JsonSerializer serailizer = new JsonSerializer(); 

     using (StreamReader json = File.OpenText(singleFilePath)) 
     { 
      using (JsonTextReader reader = new JsonTextReader(json)) 
      { 
       //if array do this 
       phones = serailizer.Deserialize<List<Phone>>(reader); 
       //if object do this 
       phone = serailizer.Deserialize<Phone>(reader); 
      } 
     } 

     HttpResponseMessage response = Request.CreateResponse<List<Phone>>(HttpStatusCode.OK, phones); 

     return response; 
    } 

Bunu yapmanın yukarıda olmayabilir en iyi yoldur. Sadece şu an olduğum yer.

cevap

71

Json.NET kullanarak, bu yapabilirdi:

string content = File.ReadAllText(path); 
var token = JToken.Parse(content); 

if (token is JArray) 
{ 
    IEnumerable<Phone> phones = token.ToObject<List<Phone>>(); 
} 
else if (token is JObject) 
{ 
    Phone phone = token.ToObject<Phone>(); 
} 
+0

İlk charcter'i kontrol edebilirsiniz, isArray = content [0] == '[' –

+0

@ johnny5 İyi bir lib kullanılabilir olduğunda elle ayrıştırma genellikle iyi bir fikir değildir. Durumda nokta, beyaz boşluk olup olmadığını kontrol etmeyi unutmuşsunuz :) '' [] "' geçerli bir json dizisidir. – dcastro

+1

bu yüzden bir cevap olarak göndermedim, çünkü bir hack ama notu layık. –

-3

Her zaman bir deneme/yakalama blokunun içinde deserialization sarabilirdiniz. Sadece try bloğu içinde bir dizi olarak serileştirmeye çalışın ve bir nesne tipi ise bir istisna atar.

try 
{ 
    //if array do this 
    phones = serailizer.Deserialize<List<Phone>>(reader); 
} 
catch //Deserialization of array failed - must be object 
{ 
    //if object do this 
    phone = serailizer.Deserialize<Phone>(reader); 
} 

Bazı insanlar böyle try/catch kullanarak üzerine kaşlarını biliyorum, ama etkili olduğunu düşünüyorum.

+1

Bir dizi olmamak Deserialize'in bir istisna oluşturmasını sağlayan tek neden değildir. Dize, sadece geçersiz bir biçimde olabilir. – dcastro

+0

Evet, açıkçası bu doğru. Bununla birlikte, OP zaten bir istisna eylemi yapmıyor olduğundan, bunu hesaba katmadım. –

+3

Ve akış denetimi olarak try/catch kullanımı .Net'de iyi bir fikir değildir. –

İlgili konular