2013-12-16 21 views
30

Tôi đang sử dụng api web .net để lấy json và đưa nó về giao diện người dùng cho góc cạnh. Các json có thể là một đối tượng hoặc một mảng. Mã của tôi hiện chỉ hoạt động đối với mảng chứ không phải đối tượng. Tôi cần phải tìm một cách để thử nghiệm hoặc xác định xem các nội dung là một đối tượng hoặc mảng.Xác định xem kết quả Json có phải là đối tượng hay mảng

Đây là mã của tôi

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; 
    } 

Các trên có thể không cách tốt nhất để làm điều này. Chỉ là nơi tôi đang ở.

Trả lời

71

Sử dụng Json.NET, bạn có thể làm điều này:

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

bạn chỉ có thể kiểm tra charcter đầu tiên, isArray = content [0] == '[' –

+0

@ johnny5 Phân tích cú pháp thủ công khi có một lib tốt có sẵn nói chung không phải là một ý tưởng hay. Trường hợp tại điểm, bạn quên kiểm tra khoảng trắng :) '" [] "' là một mảng json hợp lệ. – dcastro

+1

đó là lý do tại sao tôi không đăng nó như là một câu trả lời, bởi vì nó là một hack nhưng nó đáng chú ý. –

-3

Bạn luôn có thể quấn deserialization bạn bên trong khối try/catch. Chỉ cần cố gắng deserialize nó như là một mảng bên trong khối try, và nó sẽ ném một ngoại lệ nếu nó là một kiểu đối tượng.

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); 
} 

Tôi biết một số người sẽ cau mày khi sử dụng try/catch như thế này, nhưng tôi nghĩ nó hiệu quả.

+1

Không phải là một mảng không phải là lý do duy nhất khiến 'Deserialize' ném một ngoại lệ. Chuỗi có thể chỉ ở định dạng không hợp lệ. – dcastro

+0

Vâng, rõ ràng đó là sự thật. Tuy nhiên, kể từ khi OP không làm bất kỳ xử lý ngoại lệ nào, tôi đã không tài khoản cho điều đó. –

+3

Và sử dụng try/catch như một điều khiển luồng không phải là một ý tưởng hay trong .Net. –

Các vấn đề liên quan